java中深拷贝,浅拷贝 - 面试宝典

举报
皮牙子抓饭 发表于 2023/08/12 09:50:46 2023/08/12
【摘要】 在Java中,对象的拷贝可以分为深拷贝和浅拷贝两种方式。浅拷贝(Shallow Copy): 浅拷贝是指创建一个新的对象,新对象的属性和原对象的属性都指向同一内存地址。换句话说,只是复制了对象的引用而已。 在Java中,可以通过实现Cloneable接口并重写clone()方法来实现浅拷贝。示例代码如下:javaCopy codeclass Person implements Cloneab...

在Java中,对象的拷贝可以分为深拷贝和浅拷贝两种方式。

  1. 浅拷贝(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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。