我知道我可以这样创建一个对象
int[] list1 = {1, 2};
int[] list2 = list1.clone();
这通常有效。但为什么这不能正常工作:
ArrayList<Double> list1 = new ArrayList<Double>();
list1.add(1.0);
list1.add(2.0);
list1.add(0.5);
ArrayList<Double> list2 = list1.clone();
我所知道的是这段代码很好
ArrayList<Double> list2 = (ArrayList<Double>)list1.clone();
可能是因为list1.clone()不返回引用类型,所以它需要(ArrayList)使它返回引用类型。
但为什么int[] list2 = list1.clone();
可以运作?
答案 0 :(得分:4)
ArrayList
的{{1}}方法执行浅拷贝,您可以阅读here。
请考虑使用复制构造函数clone()
。像这样:
new ArrayList(listToCopy)
至于为什么你第一次尝试做的事情不起作用,ArrayList<Double> list1 = new ArrayList<Double>();
list1.add(1.0);
list1.add(2.0);
list1.add(0.5);
ArrayList<Double> list2 = new ArrayList<Double>(list1);
方法会返回clone()
类型,因此您需要先将其转换为Object
可以用它初始化另一个ArrayList<Double>
。
答案 1 :(得分:1)
你可以参考这篇文章,那里有一些有用的答案。 Deep copy, shallow copy, clone
简而言之,clone()仅复制1级对象(意味着浅拷贝),而深拷贝可以复制1级以上的对象。 你可以在这里找到一篇关于深度克隆的文章。 Deep Clone 它是构建您自己的深度克隆功能的指南。
答案 2 :(得分:0)
为了回答你的新问题,为什么int []克隆工作,这是因为当clone()在int []上运行时,它看到的只是原始类型,因此,只需返回对它的引用原始类型(恰好是,你猜对了,int [])
请参阅:http://howtodoinjava.com/2012/11/08/a-guide-to-object-cloning-in-java/