博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java List 的深拷贝
阅读量:5754 次
发布时间:2019-06-18

本文共 3657 字,大约阅读时间需要 12 分钟。

老是会遇到深拷贝与浅拷贝的问题,这里进行了一些測试。代码例如以下:

/* * To change this template, choose Tools | Templates * and open the template in the editor. */import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.*;/** * * @author User */class Weiz implements Serializable{//对象序列化。要实现这个接口  private static final long serialVersionUID=123L;//序列化版本号  double x;  public Weiz(double a){    x=a;  }}public class test_copy {    /**     * @param args the command line arguments     */    public static void main(String[] args) throws IOException, ClassNotFoundException {        // TODO code application logic here        List
lst=new ArrayList(); lst.add(new Weiz(1.1)); lst.add(new Weiz(1.2)); lst.add(new Weiz(1.3)); System.out.println("复制前。原始lst:"); for(int i=0;i
lst2=new ArrayList(lst); //lst2.set(1, new Weiz(2.1)); lst2.get(0).x=2.1; System.out.println("构造函数复制且改动后。新的lst2:"); for(int i=0;i
lst3=deepCopy(lst); lst3.get(0).x=3.1; System.out.println("对象序列化复制且改动后,新的lst3:"); for(int i=0;i
lst4=deepCopy(lst); lst4.get(0).x=4.1; System.out.println("对象序列化复制且改动后。新的lst4:"); for(int i=0;i
List
deepCopy(List
src) throws IOException, ClassNotFoundException { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(src); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in = new ObjectInputStream(byteIn); @SuppressWarnings("unchecked") List
dest = (List
) in.readObject(); return dest; } //关键代码 运行序列化和反序列化 进行深度拷贝,写法不同而已,作用一样 //个人习惯 怎么喜欢怎么来! public List deepCopy2(List src) throws IOException, ClassNotFoundException{ ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(src); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in =new ObjectInputStream(byteIn); List dest = (List)in.readObject(); return dest; } }
程序结果:
run:复制前:readdxflunwen.Weiz@c17164 1.1readdxflunwen.Weiz@1fb8ee3 1.2readdxflunwen.Weiz@61de33 1.3构造函数复制且改动后,新的lst2:readdxflunwen.Weiz@c17164 2.1readdxflunwen.Weiz@1fb8ee3 1.2readdxflunwen.Weiz@61de33 1.3构造函数复制且改动后,原始lst:readdxflunwen.Weiz@c17164 2.1readdxflunwen.Weiz@1fb8ee3 1.2readdxflunwen.Weiz@61de33 1.3对象序列化复制且改动后。新的lst3:readdxflunwen.Weiz@60aeb0 3.1readdxflunwen.Weiz@16caf43 1.2readdxflunwen.Weiz@66848c 1.3对象序列化复制且改动后,原始lst:readdxflunwen.Weiz@c17164 2.1readdxflunwen.Weiz@1fb8ee3 1.2readdxflunwen.Weiz@61de33 1.3对象序列化复制且改动后,新的lst4:readdxflunwen.Weiz@8813f2 4.1readdxflunwen.Weiz@1d58aae 1.2readdxflunwen.Weiz@83cc67 1.3对象序列化复制且改动后。原始lst:readdxflunwen.Weiz@c17164 2.1readdxflunwen.Weiz@1fb8ee3 1.2readdxflunwen.Weiz@61de33 1.3成功构建 (总时间: 4 秒)
 能够看到。用构造函数(旧List)的方法。是浅拷贝,拷贝的仅仅是List中的元素,即引用,而不是这些元素或引用指向的值。 

而通过对象序列化方法,则是深拷贝,是把这些引用指向的对象又一次创建了一份的。

从打印的结果也能够看到。浅拷贝时,新list中元素的值和旧List是一样,即引用是一样的。而深拷贝时,新List中元素的值和旧List的是不一样的。即引用值是不一样的。你想一下。深拷贝是又一次创建了一份指向的对象。那么指向这个新对象的引用值当然和旧的应该是不一样的!

对象序列化方法是參考别的文章。。

当类实现了Serializable 接口,它的对象才是可序列化的。

实际上,Serializable 是一个空接口,它的目的仅仅是标识一个类的对象能够被序列化。

可序列化类中的属性serialVersionUID用于标识类的序列化版本号,若不显示定义该属性,JVM会依据类的相关信息计算它的值,而类改动后的计算结果与改动前的计算结果往往不同,这样反序列化时就会因版本号不兼容而失败。

假设一个类是可序列化的。则它的全部子类也是可序列化的。当序列化对象时,假设对象的属性又引用其它对象。则被引用的对象也必须是可序列化的。

转载于:https://www.cnblogs.com/gavanwanggw/p/6932239.html

你可能感兴趣的文章
python_控制台输出带颜色的文字方法
查看>>
java泛型中特殊符号的含义
查看>>
一秒 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql 问题
查看>>
Android组件化最佳实践 ARetrofit原理
查看>>
舍弃浮躁, 50条重要的C++学习建议
查看>>
同步手绘板——将View的内容映射成Bitmap转图片导出
查看>>
【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!...
查看>>
微信小程序之wx.navigateback往回携带参数
查看>>
陌陌和请吃饭之类的应用,你要是能玩转,那就厉害了
查看>>
递归的运行机制简单理解
查看>>
汉字转阿斯克马值
查看>>
Java 栈与堆简介
查看>>
【supervisord】部署单进程服务的利器
查看>>
zabbix oracle监控插件orabbix部署安装
查看>>
python3 通过qq 服务器 发送邮件
查看>>
java 多线程踩过的坑
查看>>
部署Replica Sets及查看相关配置
查看>>
倒序显示数组(从右往左)
查看>>
LeetCode2_Evaluate Reverse Polish Notation评估逆波兰表达式(栈)
查看>>
文献综述二:UML技术在行业资源平台系统建模中的应用
查看>>