Java 我必须克隆()一个浮点数组吗?

Java 我必须克隆()一个浮点数组吗?,java,arrays,Java,Arrays,如果我有float[]a={1,2,3},我只能使用float[]b=a复制它获取深度副本?如何知道何时需要使用a.clone() 澄清一下:我希望能够更改a(例如a[0]=4;)而不影响b浅拷贝意味着只将新引用指向旧数组的内存位置,而深拷贝意味着分配新内存位置并将第一个数组的内容复制到其他数组 仅当您担心有人会取消/删除第一个数组时,才使用深度复制。在这种情况下,第二个数组也将指向不存在的内存或null。如果需要将内容保存在第二个数组中,请选择深度复制,否则使用浅层复制 请在此处阅读有关浅拷贝

如果我有
float[]a={1,2,3},我只能使用
float[]b=a复制它获取深度副本?如何知道何时需要使用
a.clone()


澄清一下:我希望能够更改
a
(例如
a[0]=4;
)而不影响
b

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

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

请在此处阅读有关浅拷贝和深拷贝的更多信息:

以下是制作阵列的浅拷贝或深拷贝的方法:

浅拷贝

float[] b = a;
深度复制

float[] b = Arrays.copyOf(a);

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

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

请在此处阅读有关浅拷贝和深拷贝的更多信息:

以下是制作阵列的浅拷贝或深拷贝的方法:

浅拷贝

float[] b = a;
深度复制

float[] b = Arrays.copyOf(a);

float[]b=a
表示将变量
a
持有的数组对象的引用分配给变量
b


使用或在Java中克隆数组。另请查看。

float[]b=a
表示将变量
a
持有的数组对象的引用分配给变量
b


使用或在Java中克隆数组。再看看。

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

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

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

float[] b = (float[])a.clone();

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

float[] b = (float[])a.clone();
如何知道何时需要使用.clone()

无论何时在Java中编写
a=b
,其中
a
b
不是基本体(即布尔、字符、字节、int、long、float、double),都是在复制引用

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

要获得阵列的深层拷贝并实现目标,只需克隆它:

float[] b = a.clone();
如何知道何时需要使用.clone()

无论何时在Java中编写
a=b
,其中
a
b
不是基本体(即布尔、字符、字节、int、long、float、double),都是在复制引用

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

要获得阵列的深层拷贝并实现目标,只需克隆它:

float[] b = a.clone();

只是让
float[]b=a是不够的,因为这样数组对象将在两个引用
a
b
之间共享

但是因为您有一个基元类型数组,所以使用
float[]b=a.clone()
就足够了。本例中的克隆将进行深度复制,并复制数组对象,包括其中的基元值


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

只需制作
float[]b=a是不够的,因为这样数组对象将在两个引用
a
b
之间共享

但是因为您有一个基元类型数组,所以使用
float[]b=a.clone()
就足够了。本例中的克隆将进行深度复制,并复制数组对象,包括其中的基元值


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

float[]b=a
表示
b
a
都是对同一
float[]
的引用,通过b所做的更改当然可以通过a看到,反之亦然。对不起,我当然是想问我是否可以通过b获得深度副本。分配引用时,您只复制引用。这是因为Java是一种面向对象语言,而不是函数式语言
表示
b
a
都是对同一
float[]
的引用,通过b所做的更改当然可以通过a看到,反之亦然。对不起,我当然是想问我是否可以通过b获得深度副本。分配引用时,您只复制引用。我想这是因为Java是一种OO语言,而不是函数式语言。为什么需要强制转换它?@Andreas它是隐式强制转换,不需要在这里显式强制转换。为什么需要强制转换?@Andreas它是隐式强制转换,不需要在这里显式强制转换。
copyOf
需要这么多不必要的参数。为什么不克隆
?@Andreas