2016-10-07 3 views
1

다음 코드를 고려하십시오.ConcurrentModificationException - HashMap

Map<Integer,String> map = new HashMap<Integer, String> (5); 
map.put(1, "a"); 
map.put(2, null); 
map.put(3, "b"); 
map.put(4, "e"); 
for (String str : map.values()) { 
    if ("b".equals(str)) { 
     map.put(5, "f"); 
    } 
} 
System.out.println(map.get(5)); 

발생합니다. ConcurrentModificationException이 발생합니다. 이 상황에서 우리는 반복되는 컬렉션을 수정할 수 없다는 것을 이해했습니다.
그러나 다음 코드를 고려하십시오. 나는 단지 하나의 라인을 제거합니다 map.put(4,"e");
그것은 작동합니다!

Map<Integer,String> map = new HashMap<Integer, String> (5); 
map.put(1, "a"); 
map.put(2, null); 
map.put(3, "b"); 
for (String str : map.values()) { 
    if ("b".equals(str)) { 
     map.put(5, "f"); 
    } 
} 
System.out.println(map.get(5)); 


모든 팁? 왜 이런 일이 일어 났습니까?

+3

' "b"'가 마지막 요소가됩니다. 나는 체크가 iterator의'next' 메소드에서 수행되고 더 이상 호출되지 않는다고 가정합니다. – talex

+0

완전한 중복이 아닙니다. 그러나 답변 뒤에 나오는 일반적인 생각은 같습니다. – talex

답변

1

"b"가 마지막 요소가됩니다.

반복자의 메서드 next에서 검사가 수행되고 더 이상 호출되지 않습니다.

+0

해시 맵은 예상 된 모듈 수를 현재 모듈 수로 확인하며 해시 맵의 마지막 요소에 어떤 작업을 수행했는지에 관계없이 검사 작업이 트리거되지 않습니다. 검사 작업은 다음 요소 이전에 수행되기 때문에 마지막 요소에 도달했습니다. 그래서 그것이 통과 할 것입니다. 고마워요 !!! –

관련 문제