java - ArrayList克隆仍然被引用?

标签 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 方法中返回它,但在第二个类中修改的对象似乎只被引用。

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

最佳答案

您的列表包含对 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
    }
}    

关于java - ArrayList克隆仍然被引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23324156/

相关文章:

java - 不是每次都选择随机项目

java - 服务工厂实例化的 bean 如何访问 httpServletRequest 对象?

Java - 将值从子类发送到父类(super class)

python - 在 python 中对属性应用 `map`

arrays - lodash - 计算重复项然后删除它们

java - Java Array 列表 trimToSize() 方法是否多余?

java - 使用 JSOUP 从另一个网站获取数据

java - 有没有办法将 java 应用程序或 JApplet 嵌入到网站中?

Javascript:如何将包含对象的对象转换并映射到数组中?

java - 如何在Java中创建/遍历具有复杂结构的多维arraylist?