【转】精简深拷贝ArrayList实例
原文网址:http://gghhgame51333.blog.51cto.com/138362/289383
|
作者fbysss
msn:jameslastchina@hotmail.com blog:blog.csdn.net/fbysss 声明:本文由fbysss原创,转载请注明出处 关键字:深拷贝,序列化 前言: 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实例的更多相关文章
- 对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
引用:https://www.jb51.net/article/142775.htm 列表赋值: 1 2 3 4 5 6 7 >>> a = [1, 2, 3] >>&g ...
- Java集合类库list(1)ArrayList实例
public class ArrayListTest { public static void main(String[] args) { //创建空的ArrayList列表 ArrayList al ...
- ensureCapacity增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。
扩容原则: 若参数值大于底层数组长度的1.5倍,则数组的长度就扩容为这个参数值:若小于底层数组长度的1.5倍,则数组长度就扩容为底层数组长度的1.5倍. ensureCapacity提高效率 fina ...
- 无法反序列化的java.util.ArrayList实例出来VALUE_STRING的(Can not deserialize instance of java.util.ArrayList out of VALUE_STRING)
解决方法: 设置DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY.问题解决.
- Java中如何克隆集合——ArrayList和HashSet深拷贝
编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法.需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味 ...
- 内功心法 -- java.util.ArrayList<E> (1)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- java容器详解(以Array Arrays ArrayList为例)
//先记录一个想法……java实在是太臃肿了,纯面向对象也有不少弊端…… //能不能把java精简一下啊! 先上结论: Array:认真看api索引的话,Array有两个.一个是sql中的接口,一个是 ...
- C#语言基础——集合(ArrayList集合)
集合及特殊集合 集合的基本信息: System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合.System.Collections ...
- ArrayList源码阅读笔记(基于JDk1.8)
关键常量: private static final int DEFAULT_CAPACITY = 10; 当没有其他参数影响数组大小时的默认数组大小 private static final Obj ...
随机推荐
- lession2:使用HTTP Cookie 管理器来传递cookies值
在实际进行压力测试的时候,经常会出现使用cookie传递值的情况,此时就需要使用[HTTP Cookie 管理器]来传递cookie值. 1.参照lession1中,创建线程组.sampler及聚合报 ...
- 基本SQL语句练习(order by,group by,having)
一.GROUP BY 和ORDER BY 1.使用Order by 进行排序,默认升序ASC,降序则使用DESC;(还可以这样:order by 1表示按第一列排序:order by 2 desc表示 ...
- UltraEdit环境下,php简单环境配置
1.语法高亮 菜单->视图->查看方式->选中“PHP” 2.自动补全 菜单->高级->配置->自动完成->选中“自动显示自动完成对话框”,字符数选择2-3为 ...
- DateBox( 日期输入框) 组件
本节课重点了解 EasyUI 中 DateBox(日期输入框)组件的使用方法,这个组件依赖于 Combo(自定义下拉框)和 Calendar(日历). 一. 加载方式//class 加载方式<i ...
- Kinect研究
1. 深度照相机 红外 + 2个摄像头. (1彩色摄像头,1红外发射,1接收) 红外捕捉深度. 2. OpenNI 某编程社区创建. 提供基本深度数据的访问.LGPL协议. 用户跟踪付费. 3. 问题 ...
- 初学Java ssh之Spring 第三篇
在这篇中,我学习了依赖注入的两种方式:设值注入和构造注入. 在我们以前的思维中,如果调用一个类时,我们都需要将其手动实例化,当我们创建被调用的工作不需要我们完成时,这就是控制反转,当这个将被调用的实例 ...
- (原)windows8.1上使用opencv for python
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6204100.html 参考网址: http://www.docs.opencv.org/master/ ...
- MySQL学习笔记(1) - cmd登陆和退出
1. 打开cmd,输入,回车 mysql -uroot -p -P3306 -h127. 1)-u :指定用户名,root为超级权限用户. 2)-p :输入密码,不指定时回车后会提示输入密码,并用*号 ...
- android手电筒开发
最近学习android开发,记录学习过程,分享一写小案例 一. 如下先设置好布局文件 <TextView android:id="@+id/textView1" androi ...
- web标准(复习)--7 横向导航菜单
今天我们开始学习html列表,包含以下内容和知识点: 横向列表菜单 用图片美化的横向导航 css Sprites 一.横向列表菜单前边学习过纵向导航菜单,又学习了float属性,那么要实现横向导航菜单 ...