私はハッシュマップを持っています。次のようにマップをループします。
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
のみ を変更します。はイテレータによって変更をチェックするために使用され、そのような変更がイテレータの への 2 回の呼び出しの間に発生した場合、がスローされます。これは、使用している方法が安全であることを意味します。modCount
modCount
next()
ConcurrentModificationException
put
マップ内の既存のキーの値を変更しているだけなので、これは完全に安全な操作です。
ただし、Map からエントリを削除する場合は、忘れずに Iterator を使用してください。