新しいキーを追加して構造を変更しない限り、危険はないと思いますConcurrentModificationException
。
つまり、このようなコードは設計上合法です。
NavigableMap<Integer,String> nmap =
new TreeMap<Integer,String>();
nmap.put(1, "One");
nmap.put(2, "Two");
nmap.put(3, "Three");
nmap.put(4, "Four");
nmap.put(5, "Five");
NavigableSet<Integer> nkeys =
nmap.navigableKeySet().subSet(2, true, 4, true);
for (Integer key : nkeys) {
nmap.put(key, "Blah");
}
System.out.println(nmap);
// prints "{1=One, 2=Blah, 3=Blah, 4=Blah, 5=Five}"
OpenJDKバージョンのソースコードも見て、これをバックアップしています。ここでは、が追加modCount++;
された場合にのみ実行されます。new Entry
(TreeMap
で、modCount
はとして宣言されてprivate transiet
いますが、そのアナログはAbstractList
で宣言されており、検出の目的で構造変更protected transient
の数をカウントするための使用目的が文書化されてConcurrentModificationException
います)。
さらに、のドキュメントでは、TreeMap
構造変更としてカウントされるものを明示的に明確にしています。
構造変更とは、1つ以上のマッピングを追加または削除する操作です。既存のキーに関連付けられた値を変更するだけでは、構造的な変更ではありません
上記のすべてに基づいて、はい、put
新しいキーと値のペアを追加しないaは構造上の変更ではないため、を引き起こさないと言いConcurrentModificationException
ます。