使用ArrayList参数复制构造函数

时间:2012-06-27 23:15:24

标签: java

我正在尝试为对象创建一个复制构造函数,其中一个参数是一个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?

}

1 个答案:

答案 0 :(得分:17)

  

我不确定这是否可以作为arraylist的“指针”或是否   这将创建一个全新的arraylist对象

当您使用new时,创建一个品牌打击ArrayList的新实例(这就是您所要求的)。但它也会自动创建其元素的副本(我认为这就是你要找的东西)。这意味着,如果您更改新列表中的可变对象,它也将在原始列表中更改,如果它仍然存在。这是因为List只保存了Object中的引用(有点但不完全是指针),而不是实际的Object本身。

例如:

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

所以你可以看到两个列表本身可以独立修改,但是当你使用构造函数接受另一个List时,它们都将包含对相同Person个实例的引用,并且当这些对象在一个列表中发生变化,它们也会在另一个列表中发生变化(有点像指针一样)。