原文网址:http://gghhgame51333.blog.51cto.com/138362/289383

精简深拷贝ArrayList实例(包括递归和序列化方法)
2007-07-12 16:50
作者fbysss
msn:jameslastchina@hotmail.com  
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实例的更多相关文章

  1. 对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解

    引用:https://www.jb51.net/article/142775.htm 列表赋值: 1 2 3 4 5 6 7 >>> a = [1, 2, 3] >>&g ...

  2. Java集合类库list(1)ArrayList实例

    public class ArrayListTest { public static void main(String[] args) { //创建空的ArrayList列表 ArrayList al ...

  3. ensureCapacity增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。

    扩容原则: 若参数值大于底层数组长度的1.5倍,则数组的长度就扩容为这个参数值:若小于底层数组长度的1.5倍,则数组长度就扩容为底层数组长度的1.5倍. ensureCapacity提高效率 fina ...

  4. 无法反序列化的java.util.ArrayList实例出来VALUE_STRING的(Can not deserialize instance of java.util.ArrayList out of VALUE_STRING)

    解决方法: 设置DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY.问题解决.

  5. Java中如何克隆集合——ArrayList和HashSet深拷贝

    编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法.需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味 ...

  6. 内功心法 -- java.util.ArrayList<E> (1)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  7. java容器详解(以Array Arrays ArrayList为例)

    //先记录一个想法……java实在是太臃肿了,纯面向对象也有不少弊端…… //能不能把java精简一下啊! 先上结论: Array:认真看api索引的话,Array有两个.一个是sql中的接口,一个是 ...

  8. C#语言基础——集合(ArrayList集合)

    集合及特殊集合 集合的基本信息: System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合.System.Collections ...

  9. ArrayList源码阅读笔记(基于JDk1.8)

    关键常量: private static final int DEFAULT_CAPACITY = 10; 当没有其他参数影响数组大小时的默认数组大小 private static final Obj ...

随机推荐

  1. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAApcAAAB3CAIAAADZ1fxtAAAbFElEQVR4nO2dzbHDOo6FHY9S0WqqZt

  2. [原创作品] 对获取多层json值的封装

    今天篇头不废话了,交流加群:164858883 在我们接收后端返回的json数据的时候,在数据缺失的时候,如果直接接收会导致致命错误的发生.可能有些同学会说通常都会有,不用判断直接获取也行.之前我也是 ...

  3. JAVA基础1

    阶段0:拟出一个计划 阶段1:要制作什么? 阶段2:如何构建? 阶段3:开始创建 阶段4:校订 阶段5:计划的回报   一.程序运行时,数据保存位置 1.寄存器.这是最快的保存区域,因为它位于和其他所 ...

  4. 各种快递查询--Api接口

    授权成功我的密钥 爱查快递API使用说明文档 API地址: 以前:http://api.ickd.cn/?com=[]&nu=[]&id=[]&type=[]&enco ...

  5. [置顶] ARM指令集和常用寄存器

    1) ARM指令集 32位的 ARM指令和 16位 的Thumb指令 1,寄存器寻址 MOV R1, R2  //将寄存器R2的值传给寄存器R1 2,立即寻址 MOV R0, #0XFF00 //数据 ...

  6. WSAEventSelect

    WSAEventSelect 是 WinSock 提供的一种异步事件通知I/O模型,与 WSAAsyncSelect模型有些类似.       该模型同样是接收 FD_XXX 之类的网络事件,但是是通 ...

  7. 内部类之.this&&.new

    一..this 我们都知道this是指当前类中的对象本身,但是在内部类中需要指明外部类时,this不再起作用,那应该怎么做呢?下面,让我们看看: public class DotThis { void ...

  8. IE下判断IE版本语法使用

    先摆一下判断IE版本语法 <!--[if lte IE 6]> <![endif]--> IE6及其以下版本可见 <!--[if lte IE 7]> <![ ...

  9. java开发webservice的几种方式

    webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis2 Axis是apache下一个开源的webservice开发组件 ...

  10. Nginx 主配置文件参数详解

    Nginx 主配置文件参数详解 Nginx 安装完毕后,会有响应的安装目录,安装目录里 nginx.conf 为 nginx 的主配置文件, ginx 主配置文件分为 4 部分,main(全局配置). ...