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,那么它们都会更改。