Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java arraylist复制-克隆?_Java_List_Clone_Equals - Fatal编程技术网

Java arraylist复制-克隆?

Java arraylist复制-克隆?,java,list,clone,equals,Java,List,Clone,Equals,我试图复制一个ArrayList,但它似乎只是引用它,而不是真正复制它 我的代码: List<Column> columns = columnData(referencedField.table); List<Field> newPath = new ArrayList<>(startPath); System.out.println("Equals? " + (newPath.equals(startPath))); 现在我读过关于克隆它的书,但我在这方面

我试图复制一个
ArrayList
,但它似乎只是引用它,而不是真正复制它

我的代码:

List<Column> columns = columnData(referencedField.table);
List<Field> newPath = new ArrayList<>(startPath);
System.out.println("Equals? " + (newPath.equals(startPath)));
现在我读过关于克隆它的书,但我在这方面没有经验。实际上,我想知道克隆是否真的会创建一个新对象列表,使它们不再相等,因为对于相同的内容,元素将相等


换言之,我想要的是:确保
startPath
newPath
不相等,因此不相互引用,因为我使用的是一个递归函数,它应该将列表添加到映射中。

如果在类中使用重写的equals方法而不是引用的equals,则复制的集合将等于原始集合:-)

如果您已经正确地重写了equals方法,那么就不可能不这样做。无论你如何克隆或复制它,它们都是一样的

让我详细说明一下

List<Field> newPath = new ArrayList<>(startPath);
它将迭代元素,并使用
equals
方法比较所有元素。如果元素类型的等值方法被重写以考虑它的状态,而不是默认引用相等(如您的代码>字段< /Class >类),那么两个列表中的所有元素都是相等的。


因为它们的数据是相等的,即使它们不是相同的对象。

如果在类中使用重写的equals方法而不是引用的equals,则复制的集合将等于原始集合:-)

如果您已经正确地重写了equals方法,那么就不可能不这样做。无论你如何克隆或复制它,它们都是一样的

让我详细说明一下

List<Field> newPath = new ArrayList<>(startPath);
它将迭代元素,并使用
equals
方法比较所有元素。如果元素类型的等值方法被重写以考虑它的状态,而不是默认引用相等(如您的代码>字段< /Class >类),那么两个列表中的所有元素都是相等的。


因为它们的数据是相等的,即使它们不是相同的对象。

您需要进行深度复制

List<Field> newPath = new ArrayList<>();
for(Field field: startPath){
   newPath.add(field.clone());
}
List newPath=newarraylist();
用于(字段:startPath){
newPath.add(field.clone());
}

您需要进行深度复制

List<Field> newPath = new ArrayList<>();
for(Field field: startPath){
   newPath.add(field.clone());
}
List newPath=newarraylist();
用于(字段:startPath){
newPath.add(field.clone());
}

如果我们考虑参考平等,是的,这将有所帮助。但是现在如果检查值是否相等,如果我们考虑引用相等,那么这会有所帮助。但是现在如果检查值是否相等,我需要将函数从递归转换为迭代,然后在每次迭代结束时存储列表。因为现在列表被“同时”修改,至少没有按顺序修改。似乎我需要将函数从递归转换为迭代,然后在每次迭代结束时存储列表。由于现在列表正在“同时”修改,至少没有按顺序修改。