在迭代期间更改HashMap键/值是否安全?

时间:2013-07-16 21:43:24

标签: java

我有一个HashMap。我像这样循环遍历地图:

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

我用来更新地图安全的方式吗?在某种意义上它是安全的,因为迭代它不会损坏地图。

3 个答案:

答案 0 :(得分:8)

您可以考虑更有效地编写代码:

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

这是微观优化,但有时候很重要,你不会丢失任何东西。它更短,并且清除了引导安全性的任何歧义!

答案 1 :(得分:7)

正如您在HashMap source code中看到的那样,put方法仅在提供新密钥时修改modCount。迭代器使用modCount来检查更改,如果在对迭代器next()的两次调用之间发生这种更改,则会抛出ConcurrentModificationException。这意味着您使用put的方式是安全

答案 2 :(得分:2)

由于您只是在地图中更改现有密钥的值,因此您正在执行此操作。

但是,如果你要从Map中删除一个条目,那么请记住使用Iterator。