2012-06-27 9 views
6

オブジェクトのコピーコンストラクタを作成しようとしていますが、パラメータの1つがArrayListです。ArrayListパラメータを持つコピーコンストラクタ

ArrayListオブジェクトを作成するとき、コレクションとしてパラメータを渡すことができるArrayListコンストラクタを使用することを念頭に置いていましたが、これがarraylistの "ポインタ"として機能するかどうか、全く新しいArrayListオブジェクト

を作成します。これは、コード私が持っている

public MyObject(MyObject other) 
{ 
    this.brands= other.brands; 
    this.count = other.count; 
    this.list = new ArrayList<Integer>(other.list); // will this create a new array list with no pointers to other.list's elements? 

} 
+0

要素のコピーを作成しません。 (そして奇妙なことになるかもしれません。) – esej

+2

ArrayListのソースコードを自分で確認できます。これはJDKに含まれています。 –

答えて

17

私は、これはArrayListに「ポインタ」として動作しますか 場合、これが作成されますかどうかわからないんだけど全く新しいarraylistオブジェクト

newを使用すると、ArrayListというブランドの新しいインスタンスが作成されます(これはあなたが尋ねたものです)。になります。しかし、ではなく、も自動的にその要素のコピーを作成します(これはあなたが探しているものです)。これが意味することは、新しいList内の変更可能なオブジェクトを変更した場合でも、元のList内で変更可能なオブジェクトがまだ周囲にある場合に変更されることです。これは、リストにはObjectの参照番号(ちょっとしたものだが正確なポインタではない)が含まれているため、実際のObjectのものではないからです。例えば

:だから、あなたは二つのリスト自体が独立して変更することができますが、別のListを受け入れるコンストラクタを使用する場合、両方が同じPersonインスタンスへの参照が含まれている、そしてときになること

Person person = new Person("Rob"); // create a new Object 

List<Person> myList = new ArrayList<Person>(); 
myList.add(person); 

// Create another list accepting the first one 
List<Person> myList2 = new ArrayList<Person>(myList); 

for(Person p : myList2) { 
    p.setName("John"); // Update mutable object in myList2 
} 

person = new Person("Mary"); // stick another object into myList2 
myList2.add(person); 

for(Person p : myList2) { 
    System.out.println(p.getName()); // prints John and Mary as expected 
} 

for(Person p : myList) { 
    System.out.println(p.getName()); // prints only one result, John. 
} 

見ることができますこれらのオブジェクトの状態は1つのリスト内で変化し、他のオブジェクトでも変化します(ポインタのようなもの)。

+0

コピーコンストラクタに新しいリストを作成するのがベストプラクティスといえますか?新しいリストをインスタンス化し、古いリストを反復し、新しいリストに新しいオブジェクトを追加しますか? – ashishduh

+0

かなり。このリンクを試す:http://stackoverflow.com/a/715660/473637 – Jeshurun

関連する問題