如何正确使用clone()方法?

时间:2015-01-29 01:41:43

标签: java arrays arraylist

我知道我可以这样创建一个对象

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();可以运作?

3 个答案:

答案 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/