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; } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。