Arrays.copyOf方法在进行数组拷贝时,只会进行浅拷贝,而不会返回对象的深拷贝。这意味着如果原始数组中的元素是对象,则拷贝后的数组仍然会引用相同的对象。
要解决这个问题,我们可以使用以下代码示例来实现对数组对象的深拷贝:
import java.util.Arrays;
public class DeepCopyArrayExample {
public static void main(String[] args) {
// 创建原始数组
Person[] originalArray = new Person[2];
originalArray[0] = new Person("Alice");
originalArray[1] = new Person("Bob");
// 使用Arrays.copyOf进行浅拷贝
Person[] shallowCopyArray = Arrays.copyOf(originalArray, originalArray.length);
// 修改浅拷贝数组中的第一个元素
shallowCopyArray[0].setName("Charlie");
// 打印原始数组和浅拷贝数组
System.out.println("Original Array: " + Arrays.toString(originalArray));
System.out.println("Shallow Copy Array: " + Arrays.toString(shallowCopyArray));
// 创建深拷贝数组
Person[] deepCopyArray = new Person[originalArray.length];
for (int i = 0; i < originalArray.length; i++) {
deepCopyArray[i] = new Person(originalArray[i].getName());
}
// 修改深拷贝数组中的第一个元素
deepCopyArray[0].setName("Eve");
// 打印原始数组和深拷贝数组
System.out.println("Original Array: " + Arrays.toString(originalArray));
System.out.println("Deep Copy Array: " + Arrays.toString(deepCopyArray));
}
static class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
}
在上述示例中,我们首先创建了一个原始数组originalArray,其中包含两个Person对象。然后,我们使用Arrays.copyOf方法创建了一个浅拷贝数组shallowCopyArray,并对其进行了修改。我们发现浅拷贝数组的修改也会影响原始数组。
接下来,我们手动创建了一个深拷贝数组deepCopyArray。在创建深拷贝数组时,我们使用了一个循环来逐个创建新的Person对象,并将其复制到深拷贝数组中。这样,深拷贝数组中的对象就与原始数组中的对象完全独立,修改深拷贝数组中的对象不会影响原始数组。
最后,我们打印了原始数组和浅拷贝数组、深拷贝数组的内容,以验证深拷贝数组的正确性。