30

以下のJavaコードがあります。

List<SomePojo> list = new ArrayList<SomePojo>();
//add 100 SomePojo objects to list.

現在、リストには 100 個のオブジェクトがあります。

以下のようにインスタンスをもう 1 つ作成すると:

List<SomePojo> anotherList = new ArrayList<SomePojo>();
anotherList .addAll(list);
4

5 に答える 5

39

オブジェクトはメモリに1回だけ存在します。への最初の追加listは、オブジェクト参照を追加するだけです。

anotherList.addAllまた、参照を追加するだけです。したがって、まだメモリ内のオブジェクトは100個だけです。

list要素の追加/削除によって変更した場合、変更されanotherListません。ただし、でオブジェクトを変更listすると、からアクセスするときにそのコンテンツも変更さanotherListれます。これは、両方のリストから同じ参照が参照されているためです。

于 2012-06-30T10:51:35.590 に答える
9

100、それは同じ参照を保持します。したがって、の特定のオブジェクトに変更を加えるとlist、の同じオブジェクトに影響しますanotherList

リストのいずれかでオブジェクトを追加または削除しても、他のリストには影響しません。

listanotherListは2つの異なるインスタンスであり、それらの「内部」にあるオブジェクトの同じ参照のみを保持します。

于 2012-06-30T10:48:16.820 に答える
6

の公式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

于 2012-06-30T10:52:21.103 に答える
2

インターフェイスリストaddAll(collection c)のJava APIからの抜粋ここを参照

「指定されたコレクションのすべての要素を、指定されたコレクションの反復子によって返される順序で、このリストの末尾に追加します (オプションの操作)。」

両方のリストにあるのと同じ数のオブジェクトがあります-最初のリストのオブジェクトの数と2番目のリストのオブジェクトの数-あなたの場合は100です。

于 2012-06-30T10:54:14.290 に答える
0

いいえ...ステートメントanotherList.addAll(list)を実行した後、リストデータを変更しても、別のリストには反映されません。

于 2012-06-30T10:46:55.730 に答える