繁体   English   中英

在java中制作深层副本

[英]make deep copy in java

鉴于以下代码:

ArrayList<String> original = new ArrayList<String>();
    original.add("one");
    original.add("two");
    original.add("three");

    Cache ch = new Cache();
    ch.store(original);

    original.remove(0);
    original.remove(0);
    System.out.println("modified list is"+original);
    System.out.println("cache list is"+ch.getCache());

和一个Cache类:

public class Cache {
private ArrayList<String> clone = new ArrayList<String>();

public void store(ArrayList<String> original){
    this.clone = original;
}

public ArrayList<String> getCache(){
    return this.clone;
}

}

输出是:

modified list is[three]
cache list is[three]

实际上,我想使用缓存来存储包含“一,二,三”的原始列表。 当它存储该列表,并且使用“原始”列表实现删除时,它不会影响存储在缓存中的那个,意味着它仍然包含“一,二,三”。 那怎么办呢?

您只存储列表的引用,因此您的结果是预期的!

相反,在构建时制作副本:

public void store(ArrayList<String> original){
    clone = new ArrayList<String>(original);
}

在这里恕我直言,克隆实际上指的是原始,因此您对原始所做的任何更改都将反映在克隆对象中。 为了保留克隆中原始ArrayList中的值,一种方法是通过某种逻辑而不是clone = original复制原始内容; //(正在引用)。

Cache您将声明并初始化一个新的数组列表,然后将其替换为原始引用。 做这个:

public void store(ArrayList<String> original)
    for(String element:original) {
        this.clone.add(element);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM