还是引用了ArrayList clone吗?

时间:2014-04-27 13:43:36

标签: java object arraylist reference clone

我知道ArrayList对象只作为参考传递,我在这里找到了很多关于该主题的文章。

尽管如此,即使将ArrayList克隆到临时的,也没有将Point []复制出来,我可以让它工作。我究竟做错了什么? 目标应该是在

中有一个单独的ArrayList
// setting class
public ArrayList<Point[]> getAstroidForms(){
    return astroidForms;
}

// class where i want to have a list of Point[] 
// that i can modify without changing the objects in the settings class
for (Point[] foo: settings.getAstroidForms()) {
    Point[] parr = new Point[foo.length];
    System.arraycopy(foo, 0, parr, 0, foo.length);
    forms.add(parr);
}

如上所述我也尝试了以下内容: 克隆astroidsForms并在getAstroidForms方法中返回它,但同样只能引用在第二个类中修改的对象。

非常感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:2)

您的列表包含对Point类型对象的引用数组。因此,当您创建新阵列时,您需要分配新内存并真正创建克隆。但是,如果您调用System.arraycopy()(这只是普通循环的更快版本,您可以编写自己的代码),则将原始数组的每个单元格的内容复制到目标数组的适当单元格,即复制引用。

如果您想要深度克隆,则必须创建Point的每个对象的副本。您可以使用实用程序方法或复制构造函数,也可以使Point克隆:

for (Point[] foo: settings.getAstroidForms()) {
    Point[] parr = new Point[foo.length];
    for (int i = 0; i < parr.length; i++) {
        parr[i] = new Point(foo[i]); // I assume here that you implemented correct copy constructor
    }
}