6

オブジェクトのコピー コンストラクターを作成しようとしていますが、パラメーターの 1 つが 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?

}
4

1 に答える 1

17

これがarraylistへの「ポインタ」として機能するのか、それともまったく新しいarraylistオブジェクトを作成するのかはわかりません

を使用するnewと、ブランドスパンキングの新しいインスタンスArrayList作成されます(これはあなたが求めているものです)。ただし、その要素のコピーを自動的に作成することもありません(これはあなたが探しているものだと思います)。これが意味することは、新しいリストで変更可能なオブジェクトを変更すると、元のリストがまだ存在する場合は元のリストでも変更されるということです。Objectこれは、 Listが実際Objectの s 自体ではなく、それらの s への参照 (ちょっとしたものですが、正確にはポインターではない) のみを保持するためです。

例えば:

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.
}

したがって、2 つの List 自体は個別に変更できることがわかりますが、別の を受け入れるコンストラクターを使用するListと、両方に同じPersonインスタンスへの参照が含まれ、これらのオブジェクトの状態が 1 つの List で変化すると、それらのオブジェクトも変化します。その他(ポインターのようなもの)。

于 2012-06-27T23:29:39.523 に答える