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获取

原文地址:https://www.cnblogs.com/zhuxiaopijingjing/p/12400865.html

时间: 2024-10-15 10:48:38

Java中对象的深浅克隆之序列化篇的相关文章

javascript中对象的深度克隆

零.寒暄 又是一个月多月没有更新博客了,这段时间回学校处理下论文的事情,实习的生活也暂时告一段落(在公司上班,才发现学校里面的生活简直如天堂一般,相信很多已经毕业的小伙伴肯定被我说中了,说中了请给本文点个赞,哈哈!).希望接下来自己的更新进度能加快,马上又是一年校招时,被虐也好.大牛虐别人也罢,总之祝福各位今年要找工作的小伙伴们好运.那么,今天就聊一下一个常见的笔试.面试题,js中对象的深度克隆.翻了下这个题目,在很多地方出现过,已经算一个老的题目了,但是每年的校招中总会考到,其实想想,这个题目

Java中对象、对象引用、堆、栈、值传递以及引用传递的详细解释

Java中对象.对象引用.堆.栈.值传递以及引用传递的详细解释 1.对象和对象引用的区别: (1).对象: 万物皆对象.对象是类的实例.在Java中new是用来在堆上创建对象用的.一个对象可以被多个引用所指向. (2).对象引用: 类似于C++中的地址.通过对象引用可以找到对象.一个引用可以指向多个对象.操纵的标识符实际上是指向对象的引用. 就像:对象存放在屋子里,对象的引用就相当于屋子的钥匙. 2.值传递和引用传递的区别: (1).值传递:传递的是值的拷贝.也就是说传递后就不互相关了. (2)

java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况

/* 样例1: class Parent{ int num = 3; } class Child extends Parent{ int num = 4; } */ /* 样例2: class Parent{ } class Child extends Parent{ int num = 4; } */ /* 样例3: class Parent{ void show(){ System.out.println("Parent Show!"); } } class Child exten

java中对象的初始化过程

class Parent{ int num = 8;// ->3 Parent(){ //super(); // ->2 //显示初始化 // ->3 //构造代码段 // ->4 show(); // ->5 } {// ->4 System.out.println("Parent constructor code run->"); } public void show(){//被覆盖 System.out.println("num

面试题:Java中对象序列化接口(Serializable)的意义

Serializable接口是一个里面什么都没有的接口 它的源代码是public interface Serializable{},即什么都没有. 如果一个接口里面什么内容都没有,那么这个接口是一个标识接口,比如,一个学生遇到一个问题,排错排了几天也没解决,此时,她举手了(示意我去帮他解决),然后我过去,帮他解决了,那么这个举手其实就是一个标识,自己不能解决的问题标示我去帮他解决,在Java中的这个Serializable接口是给JVM看的,告诉JVM,我不做这个类的序列化了,你(JVM)给我序

java中对象的序列化和反序列化

[对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能被序列化和反序列化.这个接口是一个表示型的接口.serialVersionUID是一个串行化类的通用标示符,反串行化就是使用这个标示符确保一个加载的类对应一个可串行化的对象. 自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象

java对象的深浅克隆

package CloneTest; class Dog implements Cloneable{ private String dname; private Integer dage; public Dog clone() throws CloneNotSupportedException{  Dog cloned=(Dog) super.clone();  return cloned;   } public String getDname() {  return dname; } publ

java中为什么实体类需要实现序列化

当客户端访问某个能开启会话功能的资源,web服务器就会创建一个HTTPSession对象,每个HTTPSession对象都会占用一定的内存,如果在同一个时间段内访问的用户太多,就会消耗大量的服务器内存,为了解决这个问题我们使用一种技术:session的持久化. 什么是session的持久化? web服务器会把暂时不活动的并且没有失效的HTTPSession对象转移到文件系统或数据库中储存,服务器要用时在把他们转载到内存. 把Session对象转移到文件系统或数据库中储存就需要用到序列化: jav

java中对象和对象的引用

在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然. 方法/步骤 1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: “按照通俗的说法,每个对象都是某个类(class)的一个实例(instance),这里,‘类’就是‘类型’的同义词.” 从这一句话就可