1

クラスのドキュメントにEntryは、を介して変更することはできないと記載されています.setValue(...)が、正常に機能するという警告もありput(...)ます。

これは、構造的な変更(つまり、新しいキーの追加)が行われない限り、のput(...)ようなコレクションビューを反復処理するときにnavigableKeySet()(つまり、結果が得られない限り)正常に機能することを意味しますか?ConcurrentModificationException

テスト中ですが、イテレーションを中断できない場合でも、(中断できないのではなく)正常に機能していることを確認したいと思います。

4

2 に答える 2

2

TreeMap状態のjavadocs:

構造変更とは、1つ以上のマッピングを追加または削除する操作です。既存のキーに関連付けられている値を変更するだけでは、構造的な変更にはなりません。

したがって、キーのセットを反復処理しながら、特定のキーに関連付けられた値を変更することが許可されていると見なすことができます。

于 2010-06-28T19:12:37.307 に答える
2

新しいキーを追加して構造を変更しない限り、危険はないと思います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ます。

于 2010-06-28T19:13:17.833 に答える