Java Copy构造函数ArrayLists

时间:2013-05-02 00:35:49

标签: java constructor copy

我正在尝试创建一个复制构造函数,考虑到对象是可变的。我的拷贝构造函数错了;我似乎无法弄清楚我做错了什么。

请不要告诉我使用clone()。在这种情况下如何完成复制构造函数?我是Java的新手,非常感谢任何帮助。

public class MyList {


public ArrayList<Cool> people;

/**
 * "people" variable as a new (empty) ArrayList of Cool objects.
 */
public MyPersonList()
{
    people = new ArrayList<Cool>(0);    
}


/**
 * A copy constructor which makes the right kind of copy considering
 * a Cool is mutable.
 */
public MyList(MyList other) 
{
    people = new ArrayList<Cool>(); 

    for(Cool p:people)
    {   
        people.add(p);
    }

}

3 个答案:

答案 0 :(得分:8)

注意:克隆列表与克隆列表中的元素不同。

这些方法都不像您希望的那样工作:

//1
people = new ArrayList<Cool>(other.people);

//2
people = new ArrayList<Cool>();
for(Cool p : other.people) {
    people.add(p);
}

上述方法将填充people,使其包含与other.people相同的元素。

但是,您不希望它包含相同的元素。您希望用other.people中的元素克隆填充它。

最好的方法是这样的:

people = new ArrayList<Cool>(other.people.size());
for(Cool p : other.people) {
    people.add((Cool)p.clone());
}

确保Cool实施Cloneable。如有必要,请覆盖clone()

答案 1 :(得分:4)

简单地说:您正在迭代people,但您应该迭代other.people变量。

只需注意:ArrayList已经提供了一个构造函数来添加另一个集合的所有项目:

ArrayList(Collection<? extends E> c)  

这样:

people = new ArrayList<Cool>(other.people); 

就够了。

答案 2 :(得分:2)

public MyList(MyList other) 
{
    people = new ArrayList<Cool>(); 

    for(Cool p:people)
    {   
        people.add(p);
    }

}

将其更改为:

public MyList(MyList other) 
{
    people = new ArrayList<Cool>(); 

    for(Cool p : other.people)
    {   
        people.add(p);
    }

}