2014-03-06 4 views
3

다음 코드에서 ConcurrentModificationException이 예상되지만 제대로 작동합니다.설명 HashMap의 @ConcurrentModificationException

HashMap<Integer, String>table1 = new HashMap<Integer, String>(); 
    table1.put(1, "Sam"); 
    table1.put(2, "Jon"); 
    table1.put(3, "Doe"); 

    Iterator itr1 = table1.entrySet().iterator(); 

    table1.put(3, "DONN"); 
    while(itr1.hasNext()) 
    { 
     System.out.println("---Value--" + itr1.next()); 
    } 

HashMap에 대한 JavaDoc을 당으로서 :이 클래스의 "모음보기 메소드」에 의해 반환

반복자 있습니다 르파 : 맵이 구조적으로 반복자 후 변경되면 이터레이터 자신의 remove 메소드를 통하는 것을 제외하고 어떤 방식 으로든 반복자는 ConcurrentModificationException을 발생시킵니다.

그래서 내가 ConcurrentModificationException을 받고해야 Iterator을 받고 후 HashMap을 수정하고 있기 때문이다. 왜 던지지 않는거야?

+1

"Fail-fast iterators는 최선의 노력을 기울여 ConcurrentModificationException을 던집니다. 따라서이 예외에 의존하는 프로그램을 작성하는 것은 잘못된 것입니다. 반복기의 fail-fast 동작은 다음과 같아야합니다. 버그를 탐지하기 위해서만 사용하십시오 *. " – kiheru

답변

4

이미 이후에 키 = 3 값을 대체하고 트리거하지 않습니다하지 않습니다 ConcurrentModificationException. 새 키 (예 : table1.put(4, "UPS");을 입력하면 ConcurrentModificationException이됩니다.

+0

고마워요 @Holger .... U r correct :) – Skabdus

2

당신은 당신이 그것을 얻을 수있는 HashMap하지 entrySet을 수정, 여기 당신은 iteratorentrySet 오버 얻을 수있다 :지도 인 경우

:

으로 당 entrySet 방법 자바 독을 (iterator 자신의 remove 연산을 통해 또는 iterator에 의해 반환 된 map 엔트리의 setValue 연산을 통하는 경우를 제외하고) 반복 결과는 정의되지 않는다.

따라서 ConcurrentModificationException을 얻지 못하고 있습니다.

이 맵에 포함되는 맵 Set 뷰를 돌려줍니다 :

여기 entrySet의 전체 explaination입니다. 집합은지도에 의해 뒷받침되므로지도에 대한 변경 사항은 집합에 반영되며 그 반대의 경우도 마찬가지입니다. 반복자에 의해 반환 된지도 엔트리의 setValue 연산을 통해 반복자 자체의 제거 연산을 통하는 경우를 제외하고, 집합에 대한 반복이 진행되는 동안지도가 수정되면 반복 결과는 정의되지 않습니다. 세트는 요소 제거를 지원합니다.이 제거는 Iterator.remove, Set.remove, removeAll, retainAll 및 clear 작업을 통해지도에서 해당 매핑을 제거합니다. add 또는 addAll 조작은 지원하지 않습니다.

+0

"undefined"는'ConcurrentModificationException'을 던지는 것을 배제하지 않으며 현재 구현에서는 * ConcurrentModificationException을 throw하지만 * 키가 추가되거나 제거 된 경우에만 발생합니다. – Holger

+2

그래, 그가 동일한 키를 사용하고 있기 때문에 'HashMap'이 수정되지 않는다. – Zeeshan

2

시도 table1.put(4, "DONN") 이터레이터는 ConcurrentModificationException과 함께 실패합니다. table1.put(3, "DONN")지도의 구조를 변경하지만이 구조적인 변경이 고려되지 않은 기존 키에 대한 항목을 퍼팅HashMap의 현재 구현이