java中如何实现深拷贝呢?
下文笔者讲述Java中深拷贝和浅拷贝的简介说明,如下所示
Java浅拷贝
浅拷贝:
按位拷贝对象
它会创建一个新对象
这个对象有着原始对象属性值的一份精确拷贝
当属性是基本类型,拷贝的就是基本类型的值
当属性是内存地址(引用类型)
拷贝的就是内存地址
如果其中一个对象改变了这个地址,就会影响到另一个对象。
Java深拷贝
深拷贝复制变量值
对于引用数据,则递归至基本类型后,再复制
深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象
深拷贝相比于浅拷贝速度较慢并且花销较大。
Java浅拷贝和深拷贝区别
浅拷贝的复制其引用
当引用指向的值改变时也会跟着变化
深拷贝则是与原来的对象完全隔离,互不影响
深拷贝的实现方法
方式1:
通过重写clone方法来实现深拷贝(实现Cloneable接口)
Object 的 clone 方法来拷贝对象。
注意事项:
对象clone方法默认是浅拷贝
实现深拷贝需要重写clone方法实现属性对象的拷贝
对涉及的每一个对象的clone方法进行重写
方式2:
通过对象序列化实现深拷贝(实现Serializable接口)
将对象序列化为字节序列后
默认会将该对象的整个对象图进行序列化
再通过反序列即可实现深拷贝
例:序列化和反序列化实现
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class ObSriaInOut {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Person p = in ();
Person p2 = out();
System.out.println(p);
System.out.println(p2);
}
public static Person out() throws IOException, FileNotFoundException {
//创建对象输出流,在使用对象输出流时必须进行对象序列化,否则会报错java.io.NotSerializableException
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("f:\\person.bin", false));
//床架你一个persn对象
Person p = new Person("张大", 22, 5000);
//写出对象流
oos.writeObject(p);
//关闭流
oos.flush();
oos.close();
return p;
}
public static Person in () throws IOException, FileNotFoundException, ClassNotFoundException {
//创建对象输入流
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("f:\\person.bin"));
//读取对象流
Person p = (Person) ois.readObject();
ois.close();
System.out.println(p.toString());
return p;
}
}
person类
package com.java265.obj.serializable;
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private double sal;
private int age;
public Person() {
super();
}
//构造方法用于初始化成员参数
public Person(String name, double sal, int age) {
super();
this.name = name;
this.sal = sal;
this.age = age;
}
@Override
public String toString() {
return this.name + "---" + this.age + "---" + this.sal;
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


