zoukankan      html  css  js  c++  java
  • 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):

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

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

  • 相关阅读:
    MQTT学习笔记——Yeelink MQTT维修 采用mqtt.js和paho-mqtt
    ubuntu 14.04设备OVS虚拟OpenFlow交换机配置汇总
    于iOS跳转到应用程序AppStore
    C++学习笔记33 转换操作符
    Win32 Windows规划 三
    [2014 Regional]牡丹江 H Hierarchical Notation 做题记录
    序言树,为了,序后,(递归)
    Visual Studio Code尝试体验
    2015第40周二Node学习
    2015第40周一Node学习
  • 原文地址:https://www.cnblogs.com/781811964-Fighter/p/3991066.html
Copyright © 2011-2022 走看看