Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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 1.7-克隆对象和him中的列表_Java_Arraylist_Clone - Fatal编程技术网

Java 1.7-克隆对象和him中的列表

Java 1.7-克隆对象和him中的列表,java,arraylist,clone,Java,Arraylist,Clone,我试着克隆一个在他体内有对象列表的对象。 我想克隆整个对象,还有他的列表 我解释我自己: 我有这个: public class MyObject implements Cloneable{ private long a; private List<AnotherObject> listA; private List<AnotherObject> listB; //getter and setter methods; @Overr

我试着克隆一个在他体内有对象列表的对象。 我想克隆整个对象,还有他的列表

我解释我自己:

我有这个:

public class MyObject implements Cloneable{
    private long a;
    private List<AnotherObject> listA;
    private List<AnotherObject> listB;

    //getter and setter methods;

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
假设我们使用了这个对象,所以我们在他里面加载了列表

现在,我想克隆它

我这样做了,觉得已经足够了

MyObject clone = (MyObject) original.clone();
但是,在调试模式下检查原始对象和克隆对象时,我发现它们的列表引用相同的内存区域

事实上,更改原始对象的listA元素此修改在克隆对象中也可见

为了解决这个问题,我做了:

clone.setListA(new ArrayList<AnotherObject>(original.getListA());
clone.setListA(新的ArrayList(original.getListA());

这是一个很好的解决方案?

可能您最好在MyObject#clone()方法中实现深度克隆,或者您可以使用一些深度克隆库,例如,有和。

Java中有两种类型的克隆:浅层克隆和深度克隆。这一种是浅层克隆

请参阅下面介绍如何实现深度克隆的文章:

您需要克隆列表,是的,如果不是,您将使用相同的引用,因此基本上是相同的列表。但是您可能也希望克隆列表中的实例。
clone.setListA(new ArrayList<AnotherObject>(original.getListA());