List的深度序列化Demo

今天项目中出现了这个问题。。。就是使用一个List去进行其他的操作,生成一个新的List。但是却将原来的List的值也给改了。。。这应该是引用传递的问题,查了资料发现这是浅拷贝造成的。(ps:使用addAll()方法是浅拷贝)

网上的定义是:

浅拷贝:被对象的任何变量都含有和原来的对象相同的值,而任何的对其他对象的引用仍然指向原来的对象。对拷贝后的引用的修改,还能影响原来的对象。

深拷贝:把要的对象所引用的对象都了一遍,对现在对象的修改不会影响原有的对象。

然后就照着网上的资料自己写了试试。下边的例子就是深拷贝和浅拷贝得到的不同结果。

 1 package demo01;
 2 
 3 import java.io.ByteArrayInputStream;
 4 import java.io.ByteArrayOutputStream;
 5 import java.io.IOException;
 6 import java.io.ObjectInputStream;
 7 import java.io.ObjectOutputStream;
 8 import java.io.Serializable;
 9 import java.util.ArrayList;
10 import java.util.List;
11 
12 
13 public class DeepCopyDemo {
14 
15     public static void printList(List<City> list){
16         for(City t : list){
17             System.out.println("中文: " + t.getName() + "英文:" + t.getEngName());
18         }
19         System.out.println("==================================");
20     }
21     
22     
23      //深拷贝
24     public static List deepCopy(List src) throws IOException, ClassNotFoundException{           
25         ByteArrayOutputStream byteOut = new ByteArrayOutputStream();           
26         ObjectOutputStream out = new ObjectOutputStream(byteOut);           
27         out.writeObject(src);                  
28         ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());           
29         ObjectInputStream in =new ObjectInputStream(byteIn);           
30         List dest = (List)in.readObject();           
31         return dest;       
32     }
33     
34     public static void main(String[] args) throws IOException, ClassNotFoundException {
35         List<City> srcList=new ArrayList<City>();
36         City p1=new City("北京","beijing");
37         City p2=new City("上海","shanghai");
38         City p3=new City("广州","guangzhou");
39         srcList.add(p1);
40         srcList.add(p2);
41         srcList.add(p3);
42 
43         List<City> destList=deepCopy(srcList);
44 //        List<City> destList=new ArrayList<City>();
45 //        destList.addAll(srcList);
46         printList(destList);
47         srcList.get(0).setEngName("bj");
48         System.out.println(srcList.get(0) == destList.get(0));
49         printList(destList);
50         printList(srcList);
51         
52     }
53 
54 }
55 
56 
57 
58 
59 class City implements Serializable{
60     private static final long serialVersionUID = -7622835197591599128L;
61     private String engName;
62     private String name;
63     
64     public City(){};
65     public City(String name,String engName){
66         this.name=name;
67         this.engName=engName;
68     }
69     public String getEngName() {
70         return engName;
71     }
72     public void setEngName(String engName) {
73         this.engName = engName;
74     }
75     public String getName() {
76         return name;
77     }
78     public void setName(String name) {
79         this.name = name;
80     }
81     
82 }

如果像代码中这样的话,就是深拷贝,结果就是这样的(这样的话就不会影响到原来的List):

 

List的深度序列化Demo

 

如果使用注释掉的那两行代码,而不使用现有的这一行(也就是使用addAll()方法)。就会影响“之前的”List,结果是:

List的深度序列化Demo

这样应该就很明显的看出效果了。

更多相关文章
  • 易网科技讯 2月15日消息,小时工应用E家洁今天宣布接受了德同领投,三家机构跟投的数千万美金的B轮融资.此前E家洁接受了腾讯的400万人民币天使投资,及其盛大领投腾讯跟投的的A轮400万美金融资.据CEO云涛透露,本轮投资将主要用于主要城市的深度拓展.相比竞争对手狂开城市的策略,云涛说这条路在没有地 ...
  • MySQL中select语句的基本语法是: select [STRAIGHT_join] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY] [DISTINCTDISTINCTROWALL] select_list [INTO {OUTFILEDU ...
  •           敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来一看,整个过程如下:读取敏感词库.如果HashSet集合中,获取页面上传文字,然 ...
  • 前言:上篇 C#基础系列——反射笔记 总结了下反射得基础用法,这章我们来看看C#的另一个基础技术——特性. 1.什么是特性:就博主的理解,特性就是在类的类名称.属性.方法等上面加一个标记,使这些类.属性.方法等具有某些统一的特征,从而达到某些特殊的需要.比如:方法的异常捕捉,你是否还在某些可能出现异 ...
  • 欢迎参加——每周六晚的BestCoder(有米!) 剪花布条 Time Limit: 1/1 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11258    Accepted Sub ...
  •                                  直方图均衡 #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgpro ...
一周排行
  • 在 DB2 9.7 使用光标稳定性隔离级别之前,一个写操作(UPDATE)将阻止同一行的读操作 (SELECT).其中的逻辑是,写操作正在修改行,读操作应该等到更新完成后看到最终提交的值. 在DB2 9.7 中,有一 ...
  • 最近一段时间,微软可谓动作频频.先是发布了正式版Vista SP1,接下来又是XP SP3的粉墨登场.但很显然,大家对于SP3的关注,显然要比早已发布的Vista SP1大了许多.而上周出现的XP SP3中文泄露版, ...
  • 这周三在同学的盛情邀请下,非常有幸能去参观了thu美院2012年本科毕业展,当然又见到了传说中的大美女,~总体感觉是:自己与她们的世界是完全不同的,自己是用一个个公式在诠释着周围的世界,而她们却用更加形象和细腻的方式 ...
  • 写在前面 渗透测试是门技术,也是一门艺术. 这门技术(艺术)一开始也不是每个人都会的,正所谓没有人一出生就会走路,从不懂到入门到深谙,一步步慢慢来,每个人都是这样:但是在这个过程中,思路无疑是最重要的,没有做不到只有 ...
  • WORD中四大核心技术是样式.域.宏和模板.本文集中讨论模板使用中的有关"模板与加载项"方面的疑问. 一.模板技术 模板是一类特殊的Word文档,它提供了编辑文档的基本工具和文本格式.模板一般包含 ...
  • SOLS是一家3D打印公司,目前为止,它主要专注于打印医用市场的可治疗足痛和其它小病的鞋垫.近日,它宣布额外融资0万美金,以帮助其将产品直接带到大众市场.这一举措将使得SOLS成为头几家将3D打印技术带到市场的可穿戴 ...
  • * 1,String,字符串常量,不可变 StringBuffer:可以变,支持多线程, StringBuilder:可以变,在大多数单线程情况下,更倾向于用StringBuilder,更快 import java. ...
  • 题目1: 题意:问最少的交换次数,使序列不递减.且交换次数不超过n. 思路:既然不超过n,那么就使用选择排序,尽管复杂度很高,但是交换次数确是至少的.每次找出最小值,然后和当前值交换即可. 题目: A. SwapSo ...
  • 在web应用中,文件上传似乎是很常见的,但是采用传统的方法不但复杂而且难以控制,需要写很多代码,像控制文件大小.文件类型的过滤.存放目录等等.这些复杂的问题在Struts2中已经不存在了,struts2默认使用com ...
  • 我使用了第二种方法,很方便: #define gettid() syscall(__NR_gettid) 用到的地方 gettid() 在linux2.4版本后,linux使用了NPTL作为自己的线程库,为了兼容PO ...