为什么 Java 方法 "Arrays.copyOf" 处理整数数组与处理对象数组时的行为不同

Why Java method "Arrays.copyOf" behaviour is not the same when it deals with an array of integers in compared to an array of objects

我使用方法 Arrays.copyOf 将一个整数数组复制到另一个数组。 如果我更改其中一个数组中的元素,相应的成员不会相应更改。

但是,当我使用相同的方法将一个对象数组复制到另一个对象数组时。 而我改变其中一个数组中的一个元素,对应的成员也随之改变。

谁能解释一下为什么两种情况下的行为不同。

示例:字符串数组

int[] array1 = {1,2,3};

int[] array2 = Arrays.copyOf(array1, array1.length);

array1[1] = 22;   // value of array2[1] is not set to 22

array1[2] = 33;   // value of array1[2] is not set to 33

示例:对象数组

Person[] AllPersons = new Person[3];

for(int i=0; i<3; i++) 
{
  AllPersons[i] = new Person();
}

AllPersons[2].Name = "xyz";

Person[] OtherPersons  =  Arrays.copyOf(AllPersons, 3);  // value of OtherPersons[2].Name is also set to "xyz"

AllPersons[2].Name = "pqr";    // value of OtherPersons[2].Name is also set to "pqr" 
OtherPersons[2].Name = "hij";   // value of AllPersons[2].Name is also set to "hij" 

那是因为当您调用 copyOf 时,它会在新分配的数组中复制对象(在您的情况下为 person)的相同引用。因此,当您更改一个时,您会在另一个中看到相同的内容。

虽然您的第一个示例处理基元而不是对象。

您复制对对象的引用,而不是对象(您需要克隆它们以获得您认为想要的内容)。

对于基元(例如 int),没有 "reference" 这样的东西,它们只是数字。所以你复制数字。

类似的方法适用于 IntegerString 等不可变对象 - 它在那里复制引用,但由于数字(或字符串)是不可变的,您会得到相同的结果。

这是因为原始Array的副本是浅拷贝。因此,当这些数组的内容是对象时,复制的数组包含引用。对于具有基元的数组(在本例中为整数),没有引用,值本身被复制。

看到这个:Does Arrays.copyOf produce a shallow or a deep copy?