java中深拷贝,浅拷贝 - 面试宝典
【摘要】 在Java中,对象的拷贝可以分为深拷贝和浅拷贝两种方式。浅拷贝(Shallow Copy): 浅拷贝是指创建一个新的对象,新对象的属性和原对象的属性都指向同一内存地址。换句话说,只是复制了对象的引用而已。 在Java中,可以通过实现Cloneable接口并重写clone()方法来实现浅拷贝。示例代码如下:javaCopy codeclass Person implements Cloneab...
在Java中,对象的拷贝可以分为深拷贝和浅拷贝两种方式。
- 浅拷贝(Shallow Copy): 浅拷贝是指创建一个新的对象,新对象的属性和原对象的属性都指向同一内存地址。换句话说,只是复制了对象的引用而已。 在Java中,可以通过实现Cloneable接口并重写clone()方法来实现浅拷贝。示例代码如下:
javaCopy codeclass Person implements Cloneable {
private String name;
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
// 测试
Person person1 = new Person("Alice");
Person person2 = (Person) person1.clone();
System.out.println(person1 == person2); // false
System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Alice
person2.setName("Bob");
System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Bob
从上述代码中可以看出,person1和person2是两个不同的对象,但它们的name属性指向同一内存地址。当修改person2的name属性时,person1的name属性并不会受到影响。 2. 深拷贝(Deep Copy): 深拷贝是指创建一个新的对象,新对象的属性和原对象的属性都是独立的,即拷贝了对象的所有内容。在Java中,可以通过实现Serializable接口并通过序列化和反序列化来实现深拷贝。示例代码如下:
javaCopy codeimport java.io.*;
class Person implements Serializable {
private String name;
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Person deepCopy() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (Person) ois.readObject();
}
}
// 测试
Person person1 = new Person("Alice");
Person person2 = person1.deepCopy();
System.out.println(person1 == person2); // false
System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Alice
person2.setName("Bob");
System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Bob
从上述代码中可以看出,person1和person2是两个不同的对象,它们的name属性分别指向不同的内存地址。当修改person2的name属性时,person1的name属性不会受到影响。这就是深拷贝的特点。
好的,以下是深拷贝和浅拷贝的代码示例: 浅拷贝示例:
javaCopy codeclass Person implements Cloneable {
private String name;
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Person person1 = new Person("Alice");
Person person2 = (Person) person1.clone();
System.out.println(person1 == person2); // false
System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Alice
person2.setName("Bob");
System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Bob
}
}
深拷贝示例:
javaCopy codeimport java.io.*;
class Person implements Serializable {
private String name;
public Person(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Person deepCopy() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (Person) ois.readObject();
}
}
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person person1 = new Person("Alice");
Person person2 = person1.deepCopy();
System.out.println(person1 == person2); // false
System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Alice
person2.setName("Bob");
System.out.println(person1.getName()); // Alice
System.out.println(person2.getName()); // Bob
}
}
这两个示例分别展示了浅拷贝和深拷贝的用法和效果。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)