深入JAVA对象深度克隆的详解

癫疯极咸

癫疯极咸

2016-02-19 09:38

今天图老师小编要跟大家分享深入JAVA对象深度克隆的详解,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!
有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值!

也许你会说,用clone()不就行了?!你的想法只对了一半,因为用clone()时,除了基础数据和String类型的不受影响外,其他复杂类型(如集合、对象等)还是会受到影响的!除非你对每个对象里的复杂类型又进行了clone(),但是如果一个对象的层次非常深,那么clone()起来非常复杂,还有可能出现遗漏!
既然用等号和clone()复制对象都会对原来对象产生影响,那么应该怎么做才能实现复制后的对象不对原来对象有任何影响呢?

其实很简单,用对象的深度克隆,这种克隆实现了克隆后的对象和原来的对象是独立开来的!
对象的深度克隆原理:将对象序列化后写在输出流里,因为写在流里面的对象是一份拷贝,原对象仍然在JVM里;然后再把输出流转换为输入流,把对象反序列化后写出来!这样就实现了对象的深度克隆,克隆后的两个对象完全独立开来,互不影响!

你会发现对象的深度克隆其实是利用的对象的序列化和反序列化,所以要进行深度克隆的对象都要实现Serializable接口!

进行深度克隆的实现代码如下:
代码如下:

public Object copy() throws IOException, ClassNotFoundException{
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   ObjectOutputStream oos = new ObjectOutputStream(bos);
   oos.writeObject(this);
   ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray()));
   return ois.readObject();
  }
展开更多 50%)
分享

猜你喜欢

深入JAVA对象深度克隆的详解

编程语言 网络编程
深入JAVA对象深度克隆的详解

基于序列化存取实现java对象深度克隆的方法详解

编程语言 网络编程
基于序列化存取实现java对象深度克隆的方法详解

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

解析JAVA深度克隆与浅度克隆的区别详解

编程语言 网络编程
解析JAVA深度克隆与浅度克隆的区别详解

深入java对象复制的分析

编程语言 网络编程
深入java对象复制的分析

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

深入java垃圾回收的详解

编程语言 网络编程
深入java垃圾回收的详解

深入Java不可变类型的详解

编程语言 网络编程
深入Java不可变类型的详解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

jdk与jre的区别 很形象很清晰通俗易懂

jdk与jre的区别 很形象很清晰通俗易懂

win10总是重启怎么办

win10总是重启怎么办
下拉加载更多内容 ↓