深拷贝、浅拷贝与引用拷贝
🧊 一、引用拷贝(Reference Copy)
定义:只是复制了对象的引用地址,并没有创建新的对象。
- 两个变量指向同一个对象。
- 修改其中一个变量指向的对象内容,另一个变量也会看到改变。
Java 示例:
int[] a = {1, 2, 3};
int[] b = a; // 仅仅是引用赋值
b[0] = 100;
System.out.println(a[0]); // 输出 100
🌊 二、浅拷贝(Shallow Copy)
定义:创建了一个新的对象,但对象内部的引用字段(如数组、对象等)仍然指向原来的对象。
- 新对象和原对象共享某些内部引用类型字段。
- 对基本类型字段进行了复制。
- 对引用类型字段只复制了引用(地址),而没有递归地复制引用对象本身。
Java 示例:
class Person {
String name;
int[] scores;
public Person(String name, int[] scores) {
this.name = name;
this.scores = scores;
}
public Person shallowCopy() {
return new Person(this.name, this.scores); // 浅拷贝
}
}
Person p1 = new Person("Tom", new int[]{90, 95});
Person p2 = p1.shallowCopy();
p2.scores[0] = 100;
System.out.println(p1.scores[0]); // 输出 100(共享了数组)
🌌 三、深拷贝(Deep Copy)
定义:不仅复制对象本身,还递归复制其引用类型的字段,彻底与原对象断开联系。
- 完全独立的两个对象,互不影响。
- 无论字段是基本类型还是引用类型,都会全部复制成新的对象。
Java 示例:
class Person implements Cloneable {
String name;
int[] scores;
public Person(String name, int[] scores) {
this.name = name;
this.scores = scores;
}
public Person deepCopy() {
int[] newScores = scores.clone(); // 深拷贝数组
return new Person(new String(name), newScores);
}
}
Person p1 = new Person("Tom", new int[]{90, 95});
Person p2 = p1.deepCopy();
p2.scores[0] = 100;
System.out.println(p1.scores[0]); // 输出 90(互不影响)
🧠 总结对比表:
类型 | 是否新建对象 | 引用字段是否复制 | 修改副本是否影响原始 |
---|---|---|---|
引用拷贝 | 否 | 否 | ✅ 会 |
浅拷贝 | ✅ 是 | ❌ 仅复制引用 | ✅ 会(引用字段) |
深拷贝 | ✅ 是 | ✅ 递归复制 | ❌ 不会 |