Java 深拷贝ArrayList实例(包括递归和序列化方法)

 

前言:
       日前一哥们问我一个有关多层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的输出。

 

本文转载自:http://blog.csdn.net/fbysss/archive/2007/07/12/1686609.aspx

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,深拷贝和浅拷贝是指创建新对象并复制原有对象数据结构的过程,通常用于复杂的数据结构如数组、集合、对象等。它们的区别在于是否完全复制了对象的所有内容,包括嵌套的对象。 **浅拷贝**(Shallow Copy):它只是将原对象的引用复制给新对象。这意味着如果新对象中包含对原对象的引用,那么修改新对象会影响到原对象。在 Java 中,对于基本类型,浅拷贝就是简单地赋值;对于引用类型(如对象),则是复制指向内存地址的引用。 例如: ```java Object obj = new Object(); Object copy = obj; // 浅拷贝,copy 和 obj 引向同一块内存 List list = new ArrayList(); // 对象 List copyList = list; // 浅拷贝list 和 copyList 都引用同一个ArrayList实例 ``` 修改 `copyList` 的元素会改变 `list`: ```java copyList.add("test"); System.out.println(list); // 输出 "test" ``` **深拷贝**(Deep Copy):则会对整个对象及其所有嵌套对象进行完整的副本操作,包括递归复制嵌套对象。这样改动一个深拷贝不会影响原始对象。在 Java 中,可以手动实现深拷贝,或者使用序列化序列化的机制,比如 `Cloneable` 接口和 `Object.clone()` 方法(虽然不是所有类都实现了 Cloneable)。 例如: ```java Object obj = new Object(); Object deepCopy = SerializationUtils.deepCopy(obj); // 使用工具类的深拷贝方法 ``` 在这个例子中,`deepCopy` 是一个新的对象,它的状态与 `obj` 完全独立。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值