以下のJavaコードがあります。
List<SomePojo> list = new ArrayList<SomePojo>();
//add 100 SomePojo objects to list.
現在、リストには 100 個のオブジェクトがあります。
以下のようにインスタンスをもう 1 つ作成すると:
List<SomePojo> anotherList = new ArrayList<SomePojo>();
anotherList .addAll(list);
以下のJavaコードがあります。
List<SomePojo> list = new ArrayList<SomePojo>();
//add 100 SomePojo objects to list.
現在、リストには 100 個のオブジェクトがあります。
以下のようにインスタンスをもう 1 つ作成すると:
List<SomePojo> anotherList = new ArrayList<SomePojo>();
anotherList .addAll(list);
オブジェクトはメモリに1回だけ存在します。への最初の追加list
は、オブジェクト参照を追加するだけです。
anotherList.addAll
また、参照を追加するだけです。したがって、まだメモリ内のオブジェクトは100個だけです。
list
要素の追加/削除によって変更した場合、変更されanotherList
ません。ただし、でオブジェクトを変更list
すると、からアクセスするときにそのコンテンツも変更さanotherList
れます。これは、両方のリストから同じ参照が参照されているためです。
100、それは同じ参照を保持します。したがって、の特定のオブジェクトに変更を加えるとlist
、の同じオブジェクトに影響しますanotherList
。
リストのいずれかでオブジェクトを追加または削除しても、他のリストには影響しません。
list
とanotherList
は2つの異なるインスタンスであり、それらの「内部」にあるオブジェクトの同じ参照のみを保持します。
の公式javadocを引用List.addAll
:
Appends all of the elements in the specified collection to the end of
this list, in the order that they are returned by the specified
collection's iterator (optional operation). The behavior of this
operation is undefined if the specified collection is modified while
the operation is in progress. (Note that this will occur if the
specified collection is this list, and it's nonempty.)
そのため、オブジェクトの参照を にコピーしlist
ますanotherList
。の参照オブジェクトを操作しないメソッドanotherList
(削除、追加、並べ替えなど) は、それに対してローカルであるため、 に影響を与えませんlist
。
インターフェイスリストのaddAll(collection c)のJava APIからの抜粋ここを参照
「指定されたコレクションのすべての要素を、指定されたコレクションの反復子によって返される順序で、このリストの末尾に追加します (オプションの操作)。」
両方のリストにあるのと同じ数のオブジェクトがあります-最初のリストのオブジェクトの数と2番目のリストのオブジェクトの数-あなたの場合は100です。
いいえ...ステートメントanotherList.addAll(list)を実行した後、リストデータを変更しても、別のリストには反映されません。