gpt4 book ai didi

java - ArrayList克隆仍然被引用?

转载 作者:行者123 更新时间:2023-12-02 05:53:31 25 4
gpt4 key购买 nike

我知道 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com