標籤:
原文網址:http://gghhgame51333.blog.51cto.com/138362/289383
精簡深拷貝ArrayList執行個體(包括遞迴和序列化方法)2007-07-12 16:50
作者fbysss msn:[email protected] blog:blog.csdn.net/fbysss 聲明:本文由fbysss原創,轉載請註明出處 關鍵字:深拷貝,序列化
前言: 日前一哥們問我一個有關多層ArrayList拷貝的問題,我幫他寫了一個常式,感覺以後用得著,便放上來了。如果要在自身類中加入Clone功能,需要implements ICloneable介面,然後用下面的相應代碼重寫clone方法即可。 原始碼: package com.sss.test;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List;/** *//** * <p>標題: </p> * <p>功能描述: <br> * * </p> * <p>著作權: Copyright (c) 2007</p> * <p>公司: </p> * @author fbysss * @version 1.0 * * </p> * <p>修改記錄:</p> * 建立時間:2007-7-12 13:34:56 * 類說明 */ public class DeepCopy ...{ //深拷貝1:遞迴方法 public void copy(List src,List dest)...{ for (int i = 0 ;i < src.size() ; i++) ...{ Object obj = src.get(i); if (obj instanceof List)...{ dest.add(new ArrayList()); copy((List)obj,(List)((List)dest).get(i)); }else...{ dest.add(obj); } } } //深拷貝2:序列化|還原序列化方法 public List copyBySerialize(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; } //淺拷貝 public void copyByAdd(List src,List dest)...{ //for (Object obj : src) {//jdk 1.5 以上版本 for (int i = 0 ; i< src.size() ;i++) ...{//jdk 1.4 Object obj = src.get(i); dest.add(obj); } } //添加引用 public void evalByAdd(List src,List dest)...{ dest.add(src); } //直接引用 public List evalByRef(List src)...{ return src; } /** *//** * @param args */ public static void main(String[] args) ...{ List srcList = new ArrayList(); List srcSubList1 = new ArrayList(); srcSubList1.add("subItem1-1"); srcSubList1.add("subItem1-2"); srcSubList1.add("subItem1-3"); List srcSubList2 = new ArrayList(); srcSubList2.add("subItem2-1"); srcSubList2.add("subItem2-2"); srcSubList2.add("subItem2-3"); srcList.add(srcSubList1); srcList.add(srcSubList2); List destList = new ArrayList(); DeepCopy dc = new DeepCopy(); /** *//***********test#1*******************/ //dc.copy(srcList,destList); /** *//***********test#2*******************/ /**//* try { destList = dc.copyBySerialize(srcList); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } */ /** *//***********test#3*******************/ dc.copyByAdd(srcList,destList); ((List)srcList.get(0)).remove(0); /** *//***********test#4*******************/ /**//* destList = dc.evalByRef(srcList); */ srcList.remove(1); dc.printList(destList); } private void printList(List destList) ...{ //for (Object obj : destList) {//jdk 1.5 以上版本 for (int i = 0 ; i< destList.size() ;i++) ...{//jdk 1.4 Object obj = destList.get(i); if (obj instanceof List)...{ List listObj = (List)obj; printList((List)listObj); }else...{ System.out.println(obj.toString()); } } }}
運行結果: test#1和test#2由於是深拷貝,輸出的都是完整的元素; test#3為淺拷貝, 不受 srcList.remove(1);的影響,但是一旦加了((List)srcList.get(0)).remove(0);就會發現少了第一個元素; test#4完全是引用src,src的任何改動都會影響dest的輸出。 |
【轉】精簡深拷貝ArrayList執行個體