2013-07-16 3 views
8

나는 HashMap을 가지고있다. 다음과 같이지도를 반복합니다.반복하는 동안 HashMap 키/값을 변경하는 것이 안전합니까?

Map<Long, Integer> map = new HashMap<Long, Integer>(); 
for (Long key : map.keySet()) { 
    int value = map.get(key); 
    value--; 
    map.put(key, value); 
} 

지도를 안전하게 업데이트하는 방법은 무엇입니까? 그것이 반복 때문에지도를 손상시키지 않는다는 의미에서 안전합니다.

답변

2

지도에서 기존 키의 값을 변경하기 때문에 작업이 완벽하게 안전합니다.

그러나 맵에서 항목을 삭제하려는 경우 Iterator를 사용하도록 기억하십시오.

7

HashMap source code에서 볼 수 있듯이 put 메서드는 새 키가 제공 될 때 modCount 만 수정합니다. modCount은 반복기에서 변경 사항을 확인하는 데 사용되며 반복기의 두 호출간에 변경이 발생하면 next(), ConcurrentModificationException이 발생합니다. 즉, put을 사용하는 방법은 안전입니다.

Map<Long, Integer> map = new HashMap<Long, Integer>(); 
for (Entry<Long, Integer> entry : map.entrySet()) { 
    entry.setValue(entry.getValue() - 1); 
} 

이 마이크로 최적화이지만, 때로는 중요한, 당신은 아무것도 잃지 말고 :

8

당신은으로보다 효율적으로 코드를 작성 고려할 수 있습니다. 부팅 시간이 짧고 안전성에 대한 모호성을 없애줍니다!

+0

이것은 너무 많은 코드입니다. 모르겠지만 추한 것을 발견했습니다. / –

관련 문제