9

私はハッシュマップを持っています。次のようにマップをループします。

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

マップを更新するために使用している方法は安全ですか? 反復のためにマップを損傷しないという意味で安全です。

4

3 に答える 3

9

次のように、コードをより効率的に書くことを検討できます。

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

これはマイクロ最適化ですが、重要な場合もあり、何も失うことはありません。より短く、起動時の安全性についてのあいまいさを解消します!

于 2013-07-16T23:07:11.870 に答える
8

HashMapのソース コードでわかるように、このメソッドは、新しいキーが提供された場合にputのみ を変更します。はイテレータによって変更をチェックするために使用され、そのような変更がイテレータの への 2 回の呼び出しの間に発生した場合、がスローされます。これは、使用している方法が安全であることを意味します。modCountmodCountnext()ConcurrentModificationExceptionput

于 2013-07-16T22:14:40.580 に答える
3

マップ内の既存のキーの値を変更しているだけなので、これは完全に安全な操作です。

ただし、Map からエントリを削除する場合は、忘れずに Iterator を使用してください。

于 2013-07-16T21:51:46.447 に答える