我已复制ArrayList
,因为我希望保留源Arraylist
的原始值。
如果我更改了我的来源ArrayList
的第一项,则会自动选择新ArrayList
的第一项值。
我使用了一些代码块,但我无法解决这个问题。
ArrayList<SicilBakiye> resultCopy = new ArrayList<SicilBakiye>();
resultCopy.addAll(result); // 1.method
resultCopy=result.clone(); // 2.method
resultCopy=result; // 3.method
如果我改变:
result.get(0).setid(5);
这会自动更改:
resultCopy.get(0).getid() // return 5
我该如何解决?谢谢你的想法
答案 0 :(得分:3)
让我们看一下您提供的3种方法,然后解决您的问题:
ArrayList resultCopy = new ArrayList();
resultCopy.addAll(结果); // 1.method
这将创建一个空数组列表,并将result
中的所有元素添加到副本中。对result
本身的任何更改(例如添加新元素或删除一个元素)都是不反映在副本中。
resultCopy = result.clone(); // 2.method
基本上和上面一样,至少使用标准实现 - 只是在clone()
内创建副本然后返回。
resultCopy =结果; // 3.method
这只是指定result
引用resultCopy
的实例,即您有2个对同一列表的引用。因此,对result
所做的任何更改均由resultCopy
反映,反之亦然。
现在问你的实际问题:
result.get(0).setid(5);
不更改result
,但 result
内的元素。因此,您还会在resultCopy
中看到这种变化。
就像我在学校上两门课程一样。如果你离开一个,你仍然会在另一个,反之亦然。但是如果你的年龄发生了变化(它将会发生;),每门课程的老师都会得到同样的答案。
您可能会追求的是深度复制:您复制列表以及列表中的元素。如果那些引用其他对象,您可能还需要复制它们 - 停止的位置取决于您的要求和对象的结构。
要创建对象的深层副本,您可以实现并在需要时调用clone()
,使用通过反射克隆的库(例如Apache Commons BeanUtils)或使用映射库(例如Dozer,Mapstruct等)。 )。
答案 1 :(得分:0)
clone()
创建一个浅表副本。这意味着不会克隆元素。 (如果他们没有实现Cloneable怎么办?)
您可能希望使用Arrays.copyOf(..)
来复制数组而不是clone()
(尽管克隆适用于数组,与其他任何内容不同)
请参阅this
答案 2 :(得分:0)
您需要对ArrayList执行“深层复制”。那就是你需要复制(克隆)列表中的每个对象。
当您执行ArrayList的浅表副本时,您的第二个ArrayList指向与原始对象相同的对象。
ArrayList<SicilBakiye> resultCopy = new ArrayList<SicilBakiye>();
for (SicilBakiye obj : original) {
resultCopy.add((SicilBakiye)obj.clone());
}
答案 3 :(得分:0)
for(SicilBakiye bakiye : result) {
resultCopy.add((SicilBakiye) bakiye.clone());
}
和
SicilBakiye implements Cloneable{
.....
public SicilBakiye clone() {
try {
return (SicilBakiye) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
答案 4 :(得分:0)
如果更改克隆 ArrayList 中的任何值,下面的示例将对其他人有所帮助
ArrayList<String> arrayListObject = new ArrayList<>();
arrayListObject.add("A");
arrayListObject.add("B");
arrayListObject.add("C");
arrayListObject.add("D");
System.out.println("Original Arraylist Values::" + arrayListObject);
ArrayList<String> arrayListClone = (ArrayList<String>) arrayListObject.clone();
System.out.println("Clone Arraylist Values::" + arrayListClone);
System.out.println("After changed position at 0 index in Clone Arraylist");
arrayListClone.set(0, "AA");
System.out.println("Original Arraylist Values::" + arrayListObject);
System.out.println("Clone Arraylist Changed Values::" + arrayListClone);
输出
Original Arraylist Values::[A, B, C, D]
Clone Arraylist Values::[A, B, C, D]
After changed position at 0 index in Clone Arraylist
Original Arraylist Values::[A, B, C, D]
Clone Arraylist Changed Values::[AA, B, C, D]