1

如果我有float[] a = {1,2,3};,我可以复制它只使用float[] b = a;以获得深层副本吗?我怎么知道什么时候需要使用a.clone()

澄清一下:我希望能够在aa[0]=4;影响b.

4

6 回答 6

5

仅仅 makefloat[] b = a;是不够的,因为这样数组对象将在 2 个引用ab.

但是因为你有一个原始类型数组就足够用了float[] b = a.clone()。在这种情况下,克隆将进行深层复制,并将复制数组对象,包括其中的原始值。

如果您有某个引用类型的数组,则需要克隆该数组,然后迭代并克隆每个对象以获取深层副本。

于 2013-06-08T08:12:59.333 回答
4

浅拷贝意味着只使新的引用指向旧数组的内存位置,而深拷贝意味着分配一个新的内存位置并将第一个数组的内容复制到另一个。

仅当您担心有人会取消/删除第一个数组时才使用深拷贝。在这种情况下,您的第二个数组也将指向不存在的内存或 null。如果您需要将内容保存在第二个数组中,则进行深拷贝,否则使用浅拷贝。

在此处阅读有关浅拷贝和深拷贝的更多信息:http ://en.wikipedia.org/wiki/Object_copy

这是您可以制作数组的浅拷贝或深拷贝的方法:

浅拷贝

float[] b = a;

深拷贝

float[] b = Arrays.copyOf(a);
于 2013-06-08T07:16:03.883 回答
2

float[] b = a;意味着您正在将 variable 持有的 Array 对象的引用分配a给 variable b

使用Arrays.copyOf()System.arraycopy()在 Java 中克隆一个数组。还要看微基准测试

于 2013-06-08T07:16:10.790 回答
1

我如何知道何时需要使用 a.clone()?

a = b每当您在 Java 中编写whereab不是原语(即 boolean、char、byte、int、long、float、double)时,您就是在复制一个引用。

在您的示例中,在编写float[] a = {1,2,3};then时float[] b = a;,您只创建一个数组,但有两个变量“指向”它。因此,对数组所做的任何更改都将反映在a和上b

要获取数组的深层副本并实现目标,只需克隆它:

float[] b = a.clone();
于 2013-06-08T07:56:30.297 回答
0

不,您需要这样做,例如:

float[] b = (float[])a.clone();
于 2013-06-08T07:18:39.583 回答
-1

我不认为你可以克隆原语,但如果你必须这样做,你总是可以创建一个新数组和一个循环来将一个的所有值复制到另一个。

于 2013-06-08T07:18:28.643 回答