Java ArrayList复制更改原始值

时间:2016-07-28 10:53:49

标签: java arraylist

我已复制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

我该如何解决?谢谢你的想法

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]