Skip to content

集合复制:深拷贝与浅拷贝

浅拷贝 vs 深拷贝

java
// 浅拷贝:复制引用
List<Student> shallow = new ArrayList<>(original);
// 两个 List 的元素引用是同一个 Student 对象
// 修改 Student 对象,两边都会变

// 深拷贝:复制对象本身
List<Student> deep = original.stream()
    .map(Student::new)  // 调用拷贝构造函数
    .collect(Collectors.toList());

浅拷贝:构造函数复制

java
List<String> original = new ArrayList<>(Arrays.asList("a", "b", "c"));
List<String> shallow = new ArrayList<>(original);

基本类型/String 的浅拷贝是安全的。


深拷贝:对象需要复制

java
List<Student> original = new ArrayList<>();
original.add(new Student("张三", 20));

List<Student> deep = original.stream()
    .map(s -> new Student(s.getName(), s.getAge()))
    .collect(Collectors.toList());

// 修改深拷贝不会影响原 List
deep.get(0).setAge(30);
System.out.println(original.get(0).getAge()); // 20,未变

常见错误

java
// ❌ 错误:直接赋值(两个引用指向同一对象)
List<Student> wrong = original;
wrong.add(new Student("李四", 25));
System.out.println(original.size()); // 4(原 List 也变了!)

总结

类型说明
浅拷贝复制集合本身,元素是同一个引用
深拷贝复制集合和所有元素
基本类型/String浅拷贝足够
自定义对象需要深拷贝

基于 VitePress 构建