-1

の場合CopyOnWriteArrayList、要素がコレクションに追加されるたびに新しいオブジェクトが作成されます。

以下の例を検討してください。

   private static void copyOnWriteArrayList() {
    List<String> playersUsing2 = new CopyOnWriteArrayList<String>();
    System.out.println("Original hashCode = " + playersUsing2.hashCode());
    playersUsing2.add("a1");
    System.out.println("After a1 hashCode = " + playersUsing2.hashCode() + " size = " + playersUsing2.size());
    addElement(playersUsing2, "a2");
    System.out.println("After b1 from copyOnWriteArrayList hashCode = " + playersUsing2.hashCode() + " size = " + playersUsing2.size());
    playersUsing2.add("b1");
    System.out.println("After b1 hashCode = " + playersUsing2.hashCode() + " size = " + playersUsing2.size());
}

private static void addElement(List<String> playersUsingNew, String value) {
    playersUsingNew.add(value);
    System.out.println("After a2 hashCode = " + playersUsingNew.hashCode() + " size = " + playersUsingNew.size());
}

要素が追加されるたびに、新しいオブジェクトが作成さplayersUsing2れ、スタック上の参照が更新されて、そのメモリ位置がポイントされます。理解できる。

ここで、別のメソッドに渡すplayersUsing2ので、新しいスタック フレームが作成され、playersUsingNew同じメモリ位置を指します。そして、新しい要素が追加されると、新しいオブジェクトが作成され、playersUsingNew新しいメモリ位置を指します。

しかし、どのようにして最初のスタック フレームplayersUsing2が更新され、最新のメモリ位置を指すのでしょうか?

実装を見ましjava.util.concurrent.CopyOnWriteArrayList.add(E)たが理解できませんでした。処理するのはネイティブ コードと JVM によるものですか。

出力:

Original hashCode = 1
After a1 hashCode = 3087 size = 1
After a2 hashCode = 98754 size = 2
After b1 from copyOnWriteArrayList hashCode = 98754 size = 2
After b1 hashCode = 3064461 size = 3
4

1 に答える 1