2011-11-28 2 views
0

HashMap m 이고 이미 키 값 쌍 <"key1", object>이 있다고 가정합니다.java hashMap 동시에 수정 예외

다음 작업을 수행 할 수 있습니까?

m.put("newkey", m.remove("key1")) 

ConcurrentModificationException을 얻을 수 있습니까?

+4

단지 그 이유가 폐쇄되고 – Matteo

+0

을 ;-) 요청하기 전에 그것을 시도? 나는 그 질문이 분명하다고 생각한다 ...? –

+0

@Matteo는 소프트웨어 프로그래밍의 세계에서 한 두 번 시도해 본다면 진정한 대답은 밝혀지지 않았으므로 코드의 일부분을 보셨을 것입니다. 때때로 문제를 재현하기가 어려울 수 있습니다 (특히 스레딩 문제). 그것을 시도한 후에도, 나는 그것이 왜 효과가 있었는지, 왜 그것이 작동하지 않는지 알고 싶다. 개인적으로 포스트를 닫는 옵션을주는 것은 매우 나쁜 습관이다. 너무 많은 사람들이 있기 때문에 똑똑한 방법으로 평균 –

답변

7

hashMap 항목을 반복하는 루프 본문에 있지 않은 한 그렇게 할 수 있습니다. 작동 방법은 제거 작업이 실행되기 전에 완료되고 완료되므로 2 행으로 수행하는 것과 의미 상으로 동일하다는 것입니다.

+0

감사합니다. 왜 루프에 들어갈 수 없습니까? thanks –

+1

루프가 맵을 반복하고 있기 때문에, iterator (예를 들어)의 현재 위치보다 먼저 맵에 표시되는 새 행을 삽입 할 수 있기 때문에 concurrentModificationException을 트리거하지 않으면 기본 맵을 수정할 수 없습니다. – Chris

+0

@shanyangqu 해시 맵을 통해 반복자를 사용하지 않는 한 루프에서이를 수행 할 수 있습니다 (foreach 루프 사용 등).이러한 반복자는 변경되지 않았는지 확인하고'ConcurrentModificationException'을 throw합니다. – Thomas

0

m.remove은 이전에 해당 키와 연결된 객체를 반환하기 때문에 원하는대로 객체를 사용할 수 있어야합니다. 그래서 아니오, 저는 여러분이 예외를 받아야한다고 생각하지 않습니다.

1

방금 ​​테스트 해드립니다.

Map<String, Object> map = new HashMap<String, Object>();   
map.put("k1", Integer.valueOf(999));   
map.put("k2", map.remove("k1")); 
System.out.println(map.get("k2")); 

인쇄 :

 
999 

예외 (ConcurrentModificationException).

0

실제로는 동시에 발생하지 않습니다. remove가 먼저 호출되고 완료되면 get이 호출되므로 예외가 발생하는 이유는 없습니다.

참조 반복 할 때 수정해야하는 경우이 : Iterate through a HashMap