我知道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方法中返回它,但同样只能引用在第二个类中修改的对象。
非常感谢您提供的任何帮助!
答案 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
}
}