如果我有float[] a = {1,2,3};
,我是否可以仅使用float[] b = a;
复制它以获得深层副本?我如何知道何时需要使用a.clone()
?
澄清一下:我希望能够在不影响a
的情况下更改a[0]=4;
(例如b
)。
答案 0 :(得分:4)
浅拷贝意味着只使新引用指向旧数组的内存位置,而深拷贝意味着分配新内存位置并将第一个数组的内容复制到另一个。
仅当您担心有人会取消/删除第一个数组时才使用深层复制。在这种情况下,您的第二个数组也将指向不存在的内存或null。如果您需要在第二个数组中保存内容,则转到深层复制,否则使用浅拷贝。
在此处阅读有关浅层和深层复制的更多信息:http://en.wikipedia.org/wiki/Object_copy
这是你可以制作数组的浅或深拷贝的方法:
浅拷贝
float[] b = a;
深层复制
float[] b = Arrays.copyOf(a);
答案 1 :(得分:4)
仅仅制作float[] b = a;
是不够的,因为数组对象将在2个引用a
和b
之间共享。
但是因为你有一个原始类型数组就足以使用float[] b = a.clone()
了。在这种情况下,克隆将进行深层复制,并将复制数组对象,包括里面的原始值。
如果您有一些引用类型的数组,则需要克隆该数组,然后迭代并克隆每个对象以获得深层副本。
答案 2 :(得分:2)
float[] b = a;
表示您将变量a
持有的Array对象的引用赋值给变量b
。
使用Arrays.copyOf()或System.arraycopy()克隆Java中的数组。另请查看micro-benchmarking。
答案 3 :(得分:1)
我如何知道何时需要使用a.clone()?
每当你在Java中写a = b
a
和b
不是原语(即boolean,char,byte,int,long,float,double)时,你就是在复制一个引用
在您的示例中,在编写float[] a = {1,2,3};
然后float[] b = a;
时,您只创建一个数组,但有两个变量“指向”它。因此,对数组所做的任何更改都将反映在a
和b
。
要获得数组的深层副本并实现目标,只需克隆它:
float[] b = a.clone();
答案 4 :(得分:0)
不需要这样做,例如:
float[] b = (float[])a.clone();
答案 5 :(得分:-1)
我认为你不能克隆基元,但是如果必须的话,你总是可以创建一个新的数组和一个循环来将一个的所有值复制到另一个。