首页 > 其他分享 >精简深拷贝ArrayList实例(包括递归和序列化方法)

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

时间:2023-09-04 16:07:03浏览次数:41  
标签:... obj src dest ArrayList List add 精简 序列化


作者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的输出。

标签:...,obj,src,dest,ArrayList,List,add,精简,序列化
From: https://blog.51cto.com/u_16245757/7351644

相关文章

  • 序列化和反序列化二叉搜索树
    设计一个算法来序列化和反序列化二叉搜索树对序列化/反序列化算法的工作方式没有限制您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。1.非递归先序遍历+编码classCodec{public://Encodesatreetoasinglestring.......
  • 记遇到的一次system error问题,主要还是ArrayList的线程安全问题
    1、问题:今天在进行页面点击的时候,突然出现了个systemerror弹出提示,而且经过多次点击之后,发现并不是每次都会有这个报错,很偶然的才会有一次报错,所以首先想到应该是跟多线程有关,不然不可能出现随机的错误2、解决:所以就去看日志,发现报错的是这个地方:Arrays.sort(taskTimes);在......
  • JDK源码阅读:ArrayList原理
    ArrayList原理ArrayList集合底层数据结构ArrayList集合介绍List接口的可调整大小的数组实现。数组:一旦初始化长度就不可以发生改变数组结构特性增删慢:每次删除元素,都需要更改数组长度、拷贝以及移动元素位置。查询快:由于数组在内存中是一块连续空间,因此可以根据地址+索引的......
  • Java反序列化:CommonsCollections6调试分析
    JDK8u71大版本中AnnotationInvocationHandler.readObject被修改了,为了使得CC1能够利用,又造了一条CC6CC6解决的是CC1在高版本jdk上无法利用的问题这里搬一下web佬Boogipop的整理图:环境搭建JDK测试版本:JDK11基础知识1.CC1和CC6的恶意代码执行触发链再来捋顺一下这条恶......
  • ArrayList与LinkedList的底层原理
    ArrayList是Java中常用的List集合,它基于数组来存储和操作数据。以下是ArrayList的底层原理:内部数组:ArrayList内部维护一个Object类型的数组来存储元素。初始时,数组的长度为0。当添加元素时,数组会根据需要自动扩容。动态扩容:当ArrayList中的元素数量超过当前数组的容量时,Arra......
  • C#中泛型集合List<T>反序列化问题及解决方法
    一、普通类型的反序列化程序集问题及处理方法在一些应用系统中常常有两个子系统软件A与B:A软件序列化一个数据文件,该文件将在B软件中使用。例如,在15年的交通运输部小样本调查数据的审核软件中,A软件就是笔者自己用的审核规则编制软件;B软件则是给用户使用的审核小样本调查数据的客户......
  • dubbo 支持的 9 种协议和对应序列化协议
    1、dubbo协议(默认)默认就是走dubbo协议的,单一长连接,NIO异步通信,基于hessian作为序列化协议2、rmi协议走java二进制序列化,多个短连接,适合消费者和提供者数量差不多,适用于文件的传输,一般较少用3、hessian协议走hessian序列化协议,多个短连接,适用于提供者数量比消费者数量还多,适用......
  • 同时创建作者和作者详情表,ModelSerializer使用,模块与包的使用,反序列化校验源码分析
    1同时创建作者和作者详情表1.1django项目改名字后顺利运行#1先改文件夹名#2改项目名#3改项目内的文件夹名#4替换掉所有文件中的drf_day04---》drf_day05#5命令行中启动:pythonmanage.pyrunserver#6setting--->django--->指定项目根路径1.1作者......
  • 同时创建一对一表关系字段(作者和作者详情为例)、ModelSerializer使用、模块与包的使用
    同时创建一对一表关系字段(作者和作者详情为例)序列化器#作者表序列化类classAuthorSerializer(serializers.Serializer):name=serializers.CharField(max_length=32)age=serializers.IntegerField()sex=serializers.CharField(max_length=16)addr......
  • hashmap与hashtable,arraylist与vector
    hashmap:key可以为null,key为null的话,就不会计算hashcode码,直接给了一个0,hashmap是2倍扩容原来的容量左移一位,线程不安全,计算下标不同,hashmap下标是高位与地位的‘&’运算hashtable:key以及value都不能为null,value为null会抛异常,hashcode值是根据key来计算的,而null没有hashcode......