我有一个哈希图。我像这样遍历地图:
Map<Long, Integer> map = new HashMap<Long, Integer>();
for (Long key : map.keySet() ) {
int value = map.get(key);
value--;
map.put(key, value);
}
我用来更新地图的方式安全吗?从某种意义上说是安全的,它不会因为迭代而损坏地图。
我有一个哈希图。我像这样遍历地图:
Map<Long, Integer> map = new HashMap<Long, Integer>();
for (Long key : map.keySet() ) {
int value = map.get(key);
value--;
map.put(key, value);
}
我用来更新地图的方式安全吗?从某种意义上说是安全的,它不会因为迭代而损坏地图。
您可以考虑更有效地编写代码:
Map<Long, Integer> map = new HashMap<Long, Integer>();
for (Entry<Long, Integer> entry : map.entrySet() ) {
entry.setValue(entry.getValue() - 1);
}
这是一个微优化,但有时它很重要,而且你不会失去任何东西。它更短,消除了关于启动安全性的任何歧义!
正如您在HashMap 源代码中看到的那样,该put
方法仅modCount
在提供新键时修改。modCount
迭代器使用它来检查更改,如果在两次调用迭代器之间发生这种更改next()
,ConcurrentModificationException
则会抛出 a。这意味着您使用的方式put
是安全的。
您正在执行的操作非常安全,因为您只是在更改 Map 中现有键的值。
但是,如果您要从 Map 中删除条目,请记住使用 Iterator。