专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java 中的对象拷贝分为浅拷贝和深拷贝的简单理解

temp10 2024-10-19 14:55:23 java教程 16 ℃ 0 评论

了解深浅拷贝,先了解那些是不可变变量

在 Java 中,基础类型中的 boolean、byte、char、short、int、float、long、double 这八种类型的值是可变的,但它们本身是不可变的。除此之外,还有 String 类型和包装类型,它们的值和本身都是不可变的。

例如:

Java 中的对象拷贝分为浅拷贝和深拷贝的简单理解

String s = "Hello";
s = s + " World";

在这个例子中,虽然看起来是将字符串 "Hello" 和 " World" 拼接起来赋给变量 s,实际上是创建了一个新的字符串对象 "Hello World",并将其赋给变量 s。原来的字符串对象 "Hello" 和 " World" 并没有被修改。


  1. 浅拷贝(Shallow Copy)

浅拷贝是将原始对象的引用复制到新对象中,两个对象共享同一块内存空间。因此,当修改其中一个对象时,另一个对象也会受到影响。在 Java 中,可以通过实现 Cloneable 接口和重写 Object 类中的 clone() 方法来实现浅拷贝。例如:

public class Person implements Cloneable {
    private String name;
    private int age;
    
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

简单总结:这种方式,遇到不可能变量,就相当于完全复制了一份;单遇到了可变变量,拷贝过去的指针还是指向的原变量地址,所以存在拷贝不干净,原对象变量,克隆的也会变。

  1. 深拷贝(Deep Copy)

深拷贝是将原始对象的所有属性和引用对象复制到新对象中,新对象和原始对象完全独立,不共享任何内存空间。因此,当修改其中一个对象时,另一个对象不会受到影响。在 Java 中,可以通过实现 Serializable 接口和使用序列化来实现深拷贝。例如:

public class Person implements Serializable {
    private String name;
    private int age;
    private Address address;
    
    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();
    }
}

简单总结:这种方式,所有变量,就相当于完全复制了一份,所以需要实现Serializable接口。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表