java中如何实现深拷贝呢?

戚薇 Java经验 发布时间:2023-05-23 14:57:53 阅读数:1644 1
下文笔者讲述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;
	}
}

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202305/16848250976578.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者