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

Java 如何正确使用clone()方法?,java,arrays,arraylist,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();

我知道我可以用这种方法创建一个对象

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 list1=新的ArrayList();
清单1.添加(1.0);
清单1.添加(2.0);
清单1.添加(0.5);
ArrayList list2=list1.clone();
我所知道的是这个代码很好

ArrayList<Double> list2 = (ArrayList<Double>)list1.clone();
ArrayList list2=(ArrayList)list1.clone();
可能是因为list1.clone()不返回引用类型,所以它需要(ArrayList)使其返回引用类型


但是为什么
int[]list2=list1.clone()
可以工作吗?

ArrayList
clone()
方法进行浅层复制,您可以阅读

考虑改用复制构造函数,
newarraylist(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);
ArrayList list1=新的ArrayList();
清单1.添加(1.0);
清单1.添加(2.0);
清单1.添加(0.5);
ArrayList list2=新的ArrayList(list1);

至于您第一次尝试执行的操作失败的原因,
clone()
方法返回一个
对象
类型,因此您需要将其强制转换为
ArrayList
,然后才能使用它初始化另一个
ArrayList

ArrayList
clone()
方法执行浅层复制,您可以阅读有关该方法的内容

考虑改用复制构造函数,
newarraylist(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);
ArrayList list1=新的ArrayList();
清单1.添加(1.0);
清单1.添加(2.0);
清单1.添加(0.5);
ArrayList list2=新的ArrayList(list1);

至于您第一次尝试执行的操作失败的原因,
clone()
方法返回一个
对象
类型,因此您需要将其强制转换为
ArrayList
,然后才能使用它初始化另一个
ArrayList

你可以参考这篇文章,这里有一些有用的答案。

简而言之,clone()只复制1级的对象(即浅层复制),而深度复制可以复制1级以上的对象。 你可以在这里找到一篇关于深度克隆的文章。
这是构建自己的深度克隆功能的指南。

你可以参考这篇文章,这里有一些有用的答案。

简而言之,clone()只复制1级的对象(即浅层复制),而深度复制可以复制1级以上的对象。 你可以在这里找到一篇关于深度克隆的文章。
这是构建您自己的深度克隆函数的指南。

在回答您的新问题时,int[]克隆为什么有效,这是因为当clone()在int[]上运行时,它看到的都是基元类型,因此只返回对基元类型的引用(您猜到了,它恰好是int[])


请参阅:

回答您的新问题,为什么int[]克隆可以工作,这是因为当clone()在int[]上运行时,它看到的都是基元类型,因此,它只返回对基元类型的引用(您猜,它恰好是int[])


请参阅:

你说它工作不正常是什么意思?它表示此线型的多个标记不匹配:无法从Object转换为ArrayList你说它工作不正常是什么意思?它表示此线型的多个标记不匹配:无法从Object转换为ArrayList非常感谢,这解释了int[]。但是从你给我的网站上看,它说“如果类包含任何类类型的成员,那么只复制对这些成员的对象引用,因此原始对象和克隆对象中的成员引用都引用同一个对象。”。这是否意味着ArrayList中的list2与list1具有相同的引用?但是在我添加“list2.add(3.5);”之后,list1没有改变;列表1中的1.0、2.0和0.5仍然是与列表2中的3个相同的对象;恰好,向list2添加新对象不会向list1添加相同的对象。如果列表1有一个变量x=2.0,那么列表2也会有x=2.0,如果您在其中任何一个中更改了x,它们都会更改。非常感谢,这解释了int[]。但是从你给我的网站上看,它说“如果类包含任何类类型的成员,那么只复制对这些成员的对象引用,因此原始对象和克隆对象中的成员引用都引用同一个对象。”。这是否意味着ArrayList中的list2与list1具有相同的引用?但是在我添加“list2.add(3.5);”之后,list1没有改变;列表1中的1.0、2.0和0.5仍然是与列表2中的3个相同的对象;恰好,向list2添加新对象不会向list1添加相同的对象。如果列表1有一个变量x=2.0,那么列表2也会有x=2.0,如果您在其中任何一个中更改了x,那么它们都会更改。