2013-07-16 2 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

Это абсолютно безопасная операция, которую вы делаете, так как вы просто изменяете значение существующего ключа на карте.

Однако, если вы когда-либо удаляете запись с карты, помните, чтобы использовать Итератор.

7

Как вы можете видеть в HashMap source code, метод put изменяет только modCount, когда предоставляется новый ключ. modCount используется итератором для проверки изменений, и если такое изменение произошло между двумя вызовами на номер итератора, будет выбрано значение ConcurrentModificationException. Это означает, что способ использования put: safe.

8

Вы могли бы рассмотреть возможность написания кода более эффективно:

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

Это микро-оптимизации, но иногда это имеет значение, и вы ничего не теряете. Он короче и очищает любую двусмысленность относительно безопасности для загрузки!

+0

Это слишком много кода, я не знаю, но я нахожу это уродливым: / –

Смежные вопросы