gpt4 book ai didi

java - 为什么 Collections.copy 仍然复制引用,它不克隆复制的对象?

转载 作者:行者123 更新时间:2023-12-01 18:37:09 25 4
gpt4 key购买 nike

好的,我只想复制 List<String[]> listList<String[]> list2 。之后我将修改 list2 中的对象& 我希望它不会影响任何对象 int list .

            String[] s={"1","2"};
List<String[]> list=new ArrayList<String[]>();
list.add(s);
List<String[]> list2=new ArrayList<String[]>(list);
Collections.copy(list2,list);

list2.get(0)[1]="3";

for (String[] strings : list) {
System.out.println(Arrays.toString(strings));
}

输出:[1, 3]

为什么我们要改变 list2 中的内容&它影响list1 ?如何修复它?

最佳答案

Collections.copy()不执行深层复制。

它只是将元素从一个集合复制到另一个集合。它与 ArrayList 构造函数基本相同,因此您不需要同时调用两者。

两个列表中的第一个元素仍然引用同一个对象。因此,当您运行代码时,您正在修改两个列表中的数组。您可以迭代所有元素,并使用 Arrays.copyOf在每个列表项上。

类似这样的事情:

private List<String[]> deepCopy(List<String[]> list) {
List<String[]> copy = new ArrayList<String[]>(list.size());
for (String[] element : list) {
copy.add(Arrays.<String> copyOf(element, element.length));
}
return copy;
}

编辑: Java < 1.6 版本:

private List<String[]> deepCopy(List<String[]> list) {
List<String[]> copy = new ArrayList<String[]>(list.size());
for (String[] element : list) {
String[] elementCopy = new String[element.length];
System.arraycopy(element, 0, elementCopy, 0, element.length);
copy.add(elementCopy);
}
return copy;
}

关于java - 为什么 Collections.copy 仍然复制引用,它不克隆复制的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21499062/

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