の場合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