Java中对象的深浅克隆之序列化篇

Posted 幽暗森林之猪大屁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中对象的深浅克隆之序列化篇相关的知识,希望对你有一定的参考价值。

浅复制与深复制的区别浅复制:
被复制对象的所有变量都含有与原有对象相同的value而所有的对其他对象引用仍然指向原来对象.
浅复制仅仅复制对象而没有复制其引用的对象
常见例子

List<Map<String,String>> list1 = new ArrayList<Map<String, String>>();
       Map<String,String> map = new HashMap<String, String>();
       map.put("name", "xiaoming");
       map.put("age", "28");
       list1.add(map);
       //克隆方法1:利用原list1作为参数直接构造方法生成。
       List<Map<String,String>> list2 = new ArrayList<Map<String, String>>(list1);
        //克隆方法2:手动遍历将原list1中的元素全部添加到复制表中。
       for(int i = 0, l = list1.size(); i < l; i++)
           list2.add(list1.get(i));   //克隆方法3:调用Collections的静态工具方法 Collections.copy
List是一个对象,存储类的类型是存储地址.而存储基本类型则存储value.
元素复制下来而不只是复制存储里面的元素.list层实现这个问题
深复制:
被复制对象的所有变量都含有与其原本对象相同的值,除去引用其他对象变量.
引用其他对象的变量也指向被复制的新对象了.总而言之深复制是把原来的对象
把所有对象都复制过来新对象了
把对象写道流里面的过程是叫串行化过程(Serilization),把对象从流中读出来叫并行化(Deserialization)
应当注意是写在流里的对象的一个拷贝,而原对象仍然存在jvm,因此串行化数据只是对象一个拷贝
若深复制一个对象,会常用对象实现Serializable接口,即把对象拷贝到串行化环境中写到并行化的流里面再从流读出来
即可实现深复制
例子:
public List<Map<String,String>> deClone(Object obj) throws IOException,OptionalDataException,ClassNotFoundException{
//将对象写到流里
  ByteArrayOutoutStream bo=new ByteArrayOutputStream();
  ObjectOutputStream oo=new ObjectOutputStream(bo);
  oo.writeObject(obj);//从流里读出来
  ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());
  ObjectInputStream oi=new ObjectInputStream(bi);
  return(oi.readObject());
}
更多java学习资料可关注:itheimaGZ获取

以上是关于Java中对象的深浅克隆之序列化篇的主要内容,如果未能解决你的问题,请参考以下文章

Java面试之对象拷贝

Java面试之对象拷贝

第35题JAVA高级技术-对象克隆4(序列化与对象克隆)

从克隆(深浅拷贝)到原型设计模式

第35题JAVA高级技术-对象克隆4(序列化与对象克隆)

Python (深浅拷贝)