[Java] Java List 的深拷贝 →→→→→进入此内容的聊天室

来自 , 2019-03-30, 写在 Java, 查看 143 次.
URL http://www.code666.cn/view/3473decc
  1. </pre><pre name="code" class="java">/*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5.  
  6. import java.io.ByteArrayInputStream;
  7. import java.io.ByteArrayOutputStream;
  8. import java.io.IOException;
  9. import java.io.ObjectInputStream;
  10. import java.io.ObjectOutputStream;
  11. import java.io.Serializable;
  12. import java.util.*;
  13.  
  14. /**
  15.  *
  16.  * @author User
  17.  */
  18.  
  19. class Weiz implements Serializable{//对象序列化,要实现这个接口
  20.   private static final long serialVersionUID=123L;//序列化版本
  21.   double x;
  22.   public Weiz(double a){
  23.     x=a;
  24.   }
  25. }
  26.  
  27. public class test_copy {
  28.  
  29.     /**
  30.      * @param args the command line arguments
  31.      */
  32.     public static void main(String[] args) throws IOException, ClassNotFoundException {
  33.         // TODO code application logic here
  34.         List<Weiz> lst=new ArrayList();
  35.         lst.add(new Weiz(1.1));
  36.         lst.add(new Weiz(1.2));
  37.         lst.add(new Weiz(1.3));
  38.         System.out.println("复制前,原始lst:");
  39.         for(int i=0;i<lst.size();++i){
  40.           System.out.println(lst.get(i)+" "+lst.get(i).x);
  41.         }
  42.         //System.out.println();
  43.         //构造函数复制                     浅拷贝
  44.         List<Weiz> lst2=new ArrayList(lst);
  45.         //lst2.set(1, new Weiz(2.1));
  46.         lst2.get(0).x=2.1;
  47.         System.out.println("构造函数复制且修改后,新的lst2:");
  48.         for(int i=0;i<lst2.size();++i){
  49.           System.out.println(lst2.get(i)+" "+lst2.get(i).x);
  50.         }
  51.         System.out.println("构造函数复制且修改后,原始lst:");
  52.         for(int i=0;i<lst.size();++i){
  53.           System.out.println(lst.get(i)+" "+lst.get(i).x);
  54.         }
  55.        
  56.         List<Weiz> lst3=deepCopy(lst);
  57.         lst3.get(0).x=3.1;
  58.         System.out.println("对象序列化复制且修改后,新的lst3:");
  59.         for(int i=0;i<lst3.size();++i){
  60.           System.out.println(lst3.get(i)+" "+lst3.get(i).x);
  61.         }
  62.         System.out.println("对象序列化复制且修改后,原始lst:");
  63.         for(int i=0;i<lst.size();++i){
  64.           System.out.println(lst.get(i)+" "+lst.get(i).x);
  65.         }
  66.        
  67.         List<Weiz> lst4=deepCopy(lst);
  68.         lst4.get(0).x=4.1;
  69.         System.out.println("对象序列化复制且修改后,新的lst4:");
  70.         for(int i=0;i<lst4.size();++i){
  71.           System.out.println(lst4.get(i)+" "+lst4.get(i).x);
  72.         }
  73.         System.out.println("对象序列化复制且修改后,原始lst:");
  74.         for(int i=0;i<lst.size();++i){
  75.           System.out.println(lst.get(i)+" "+lst.get(i).x);
  76.         }
  77.     }
  78.    
  79.     //关键代码 执行序列化和反序列化  进行深度拷贝  
  80.     public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {  
  81.         ByteArrayOutputStream byteOut = new ByteArrayOutputStream();  
  82.         ObjectOutputStream out = new ObjectOutputStream(byteOut);  
  83.         out.writeObject(src);  
  84.  
  85.         ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());  
  86.         ObjectInputStream in = new ObjectInputStream(byteIn);  
  87.         @SuppressWarnings("unchecked")  
  88.         List<T> dest = (List<T>) in.readObject();  
  89.         return dest;  
  90.     }  
  91.      
  92.        //关键代码 执行序列化和反序列化  进行深度拷贝,写法不同而已,作用一样  
  93.        //个人习惯 怎么喜欢怎么来!  
  94.     public List deepCopy2(List src) throws IOException, ClassNotFoundException{            
  95.         ByteArrayOutputStream byteOut = new ByteArrayOutputStream();            
  96.         ObjectOutputStream out = new ObjectOutputStream(byteOut);            
  97.         out.writeObject(src);                    
  98.         ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());            
  99.         ObjectInputStream in =new ObjectInputStream(byteIn);            
  100.         List dest = (List)in.readObject();            
  101.         return dest;        
  102.     }  
  103. }//源代码片段来自云代码http://yuncode.net
  104.                        
  105.  
  106. run:
  107. 复制前:
  108. readdxflunwen.Weiz@c17164 1.1
  109. readdxflunwen.Weiz@1fb8ee3 1.2
  110. readdxflunwen.Weiz@61de33 1.3
  111. 构造函数复制且修改后,新的lst2:
  112. readdxflunwen.Weiz@c17164 2.1
  113. readdxflunwen.Weiz@1fb8ee3 1.2
  114. readdxflunwen.Weiz@61de33 1.3
  115. 构造函数复制且修改后,原始lst:
  116. readdxflunwen.Weiz@c17164 2.1
  117. readdxflunwen.Weiz@1fb8ee3 1.2
  118. readdxflunwen.Weiz@61de33 1.3
  119. 对象序列化复制且修改后,新的lst3:
  120. readdxflunwen.Weiz@60aeb0 3.1
  121. readdxflunwen.Weiz@16caf43 1.2
  122. readdxflunwen.Weiz@66848c 1.3
  123. 对象序列化复制且修改后,原始lst:
  124. readdxflunwen.Weiz@c17164 2.1
  125. readdxflunwen.Weiz@1fb8ee3 1.2
  126. readdxflunwen.Weiz@61de33 1.3
  127. 对象序列化复制且修改后,新的lst4:
  128. readdxflunwen.Weiz@8813f2 4.1
  129. readdxflunwen.Weiz@1d58aae 1.2
  130. readdxflunwen.Weiz@83cc67 1.3
  131. 对象序列化复制且修改后,原始lst:
  132. readdxflunwen.Weiz@c17164 2.1
  133. readdxflunwen.Weiz@1fb8ee3 1.2
  134. readdxflunwen.Weiz@61de33 1.3
  135. 成功构建 (总时间: 4)//源代码片段来自云代码http://yuncode.net
  136.                        

回复 "Java List 的深拷贝"

这儿你可以回复上面这条便签

captcha