在 Java 中,数组和集合的深拷贝与浅拷贝的概念与复制对象的引用和内容相关。深拷贝
是创建一个新对象,并递归地复制其所有内容
,而浅拷贝
则只是复制对象的引用
。
import java.util.Arrays;
public class DeepCopyArrayExample {
public static void main(String[] args) {
int[] originalArray = {1, 2, 3, 4, 5};
// 深拷贝数组
int[] deepCopyArray = Arrays.copyOf(originalArray, originalArray.length);
// 修改原始数组内容
originalArray[0] = 100;
// 输出深拷贝数组
System.out.println("Original Array: " + Arrays.toString(originalArray));
System.out.println("Deep Copy Array: " + Arrays.toString(deepCopyArray));
}
}
在上述例子中,Arrays.copyOf()
方法创建了一个新的数组,并复制了原始数组的内容。修改原始数组不会影响深拷贝的数组。
public class ShallowCopyArrayExample {
public static void main(String[] args) {
int[] originalArray = {1, 2, 3, 4, 5};
// 浅拷贝数组
int[] shallowCopyArray = originalArray;
// 修改原始数组内容
originalArray[0] = 100;
// 输出浅拷贝数组
System.out.println("Original Array: " + Arrays.toString(originalArray));
System.out.println("Shallow Copy Array: " + Arrays.toString(shallowCopyArray));
}
}
在浅拷贝中,shallowCopyArray
实际上是引用了原始数组,因此修改原始数组会影响到浅拷贝的数组。
在 Java 中,通常使用构造函数或者 clone 方法来实现集合的深拷贝或浅拷贝。
import java.util.ArrayList;
import java.util.List;
public class DeepCopyListExample {
public static void main(String[] args) {
List<Integer> originalList = new ArrayList<>();
originalList.add(1);
originalList.add(2);
originalList.add(3);
// 深拷贝集合
List<Integer> deepCopyList = new ArrayList<>(originalList);
// 修改原始集合内容
originalList.set(0, 100);
// 输出深拷贝集合
System.out.println("Original List: " + originalList);
System.out.println("Deep Copy List: " + deepCopyList);
}
}
import java.util.ArrayList;
import java.util.List;
public class ShallowCopyListExample {
public static void main(String[] args) {
List<Integer> originalList = new ArrayList<>();
originalList.add(1);
originalList.add(2);
originalList.add(3);
// 浅拷贝集合
List<Integer> shallowCopyList = originalList;
// 修改原始集合内容
originalList.set(0, 100);
// 输出浅拷贝集合
System.out.println("Original List: " + originalList);
System.out.println("Shallow Copy List: " + shallowCopyList);
}
}
在集合中,深拷贝通常需要手动创建一个新的集合,并将原始集合中的元素逐个复制到新集合中。而浅拷贝则可以使用构造函数或者 clone
方法来简单地创建一个引用了原始集合的新集合。需要注意的是,如果集合中的元素是可变对象,深拷贝时还需要对元素进行递归的深拷贝。