2012-06-27 34 views
6

我想为一个对象创建一个拷贝构造函数,其中一个参数是一个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

它不会制作元素的副本。 (和imho opionion会很奇怪。) – esej

+2

你可以自己查看ArrayList的源代码。它包含在您的JDK中。 –

回答

17

我不知道这是否会作为一个“指针”到ArrayList工作,或者 这将创建一个全新的数组列表对象

当您使用new时,它会创建一个品牌打屁股新实例ArrayList(这是您所问)。但它会而不是也会自动创建其元素的副本(我认为这是您正在寻找的)。这意味着,如果您在新List中更改可变对象,则它也会在原始列表中更改,如果它仍在附近。这是因为该列表仅保留对其中的Object s的引用(有点不恰当,但不完全是指针),而不是实际的Object 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. 
} 

所以,你可以看到两个列表本身可以独立修改,但是当你使用构造函数接受另一个List,都将包含对同一Person情况下,当这些对象的状态在一个List中改变,它们也会在另一个List中改变(就像指针一样)。

+0

那么,你会怎么说是在复制构造函数中创建一个全新列表的最佳实践?实例化一个新列表,迭代旧列表,并将新对象添加到新列表中? – ashishduh

+0

非常。试试这个链接:http://stackoverflow.com/a/715660/473637 – Jeshurun