转载---Java集合对象的深度复制与普通复制
原博文:http://blog.csdn.net/qq_29329775/article/details/49516247
最近在做算法作业时出现了错误,原因是没有弄清楚java集合的深度复制和浅度复制的区别。
1.首先是对Java集合对象得浅复制与深度复制的理解
普通的集合复制只是将内存中栈的地址快拷贝一份,使得一个新的集合对象指向这个地址块,但是集合中的对象变量却是指向堆中的同一块区域。所以当拷贝的集合修改了集合对象内的数据,那么源集合对象也就随之改变了,这样的效果我们称之为Java集合对象的浅复制,即只是在栈中拷贝了,而堆中的数据并没有拷贝。而深度复制则是同时在栈中和堆中的数据进行拷贝,这样,其拷贝的集合和被拷贝的集合已经没有任何关系了。
2.一个例子
新建一个Demo类
public class Demo {
private int demoValue;
public void setDemoValue(int value){
this.demoValue = value;
}
public int getDemoValue(){
return this.demoValue;
}
public Demo(){
}
public Demo(int demoValue){
this.demoValue = demoValue;
}
}
接下来,我们试验一下浅复制:
@Test
public void testCommonCopy() { // Here I create a source collection.
ArrayList<Demo> sourceCollection = new ArrayList<Demo>(); // Here I add some objects to sourceCollection.
sourceCollection.add(new Demo(1));
sourceCollection.add(new Demo(2)); // Here I create a new empty collection.
ArrayList<Demo> newCollection = new ArrayList<Demo>();
newCollection.addAll(sourceCollection); // Now I modify some objects in new collection.
newCollection.get(0).setDemoValue(3); // Now We verify what it is inside the source collection.
for(Demo demo : sourceCollection){
System.out.println(demo.getDemoValue());
} // Now I verify if the source Collection is modified.
Assert.assertEquals(sourceCollection.get(0).getDemoValue(),1);
}

对其的执行结果,很明显,newCollection中改变的Demo对象在SourceCollection中也跟着改变了,这说明两个集合中的Demo对象是同一个对象。这也是浅复制所存在的弊端。那么如何将两个集合独立开来呢,即如何进行深度复制,我们不烦继续往下阅读:
protected Demo clone() throws CloneNotSupportedException {
return (Demo)super.clone();
}
然后我们来进行深度复制:
@Test
public void testCopyDeep() throws Exception{
ArrayList<Demo> sourceCollection = new ArrayList<Demo>();
sourceCollection.add(new Demo(1));
sourceCollection.add(new Demo(2)); ArrayList<Demo> newCollection = new ArrayList<Demo>();
for(Demo demo : sourceCollection){
newCollection.add(demo.clone());
}
newCollection.get(0).setDemoValue(3);
for(Demo demo : sourceCollection){
System.out.println(demo.getDemoValue());
}
Assert.assertEquals(sourceCollection.get(0).getDemoValue(),1);
}
最后我们来观察一下结果:搞定

接下来我们来分析一下出现这个现象的原因:
原文博客:http://blog.csdn.net/qq_29329775/article/details/49516247
转载---Java集合对象的深度复制与普通复制的更多相关文章
- [转载] Java集合---HashMap源码剖析
转载自http://www.cnblogs.com/ITtangtang/p/3948406.html 一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射 ...
- [转载] Java集合框架之小结
转载自http://jiangzhengjun.iteye.com/blog/553191 1.Java容器类库的简化图,下面是集合类库更加完备的图.包括抽象类和遗留构件(不包括Queue的实现): ...
- [转载]Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- java集合对象区别二
集合包是Java中最常用的包,它最常用的有Collection和Map两个接口的实现类,Collection用于存放多个单对象,Map用于存放Key-Value形式的键值对. Collection中常 ...
- Java集合容器的深度理解
Java容器里有很多写好的容器API,这使我们很方便的可以存储.操作我们的数据. 下面是我写的容器的特点,一些容器的不同之处,从底层源码解析一下容器实现原理 一.常用的容器目录 上图可以看出,java ...
- [转载]Java集合框架的常见面试题
http://www.jfox.info/40-ge-java-ji-he-lei-mian-shi-ti-he-da-an 整理自上面链接: Java集合框架为Java编程语言的基础,也是Java面 ...
- [转载]Java集合系列大全总结
Java 集合系列目录(Category) 22:06:49 2019-02-27
- java集合对象实现原理
1.集合包 集合包是java中最常用的包,它主要包括Collection和Map两类接口的实现. 对于Collection的实现类需要重点掌握以下几点: 1)Collection用什么数据结构实现? ...
- Java集合对象比对
1. 场景描述 通过java代码从外围接口中获取数据并落地,已经存在的不落地,不存在的落地,因有部分字段变化是正常的,只需比对3个字段相同即为相同. 2. 解决方案 设置定时任务(三个标签完成spri ...
随机推荐
- DuiLib学习笔记1——编译运行demo
c++中皮肤问题比较麻烦,MFC自带的太难用.DirectUI界面库就比较强大了,之前像skin++之类的基于DirectUI收费昂贵.DuiLib是基于DirectUI的界面库,可以将用户界面和处理 ...
- S3C2440 裸机程序之音频
mini2440之Main分析 2012-03-17 20:51:29 分类: 嵌入式 /****************************************************** ...
- 。。。在学习新框架Spring MVC的感受。。。
已经学习一遍Spring MVC了,感觉还是懵懵懂懂的,特别是重定向,路径,参数的这些问题,心好乱,不过,这,都不是问题!!! 继续努力,努力到会为止!!!加油!!!
- IIS配置注意点
1.是否有权限 2.程序池是否为4.0集成 3.是否启用目录浏览模式:目录浏览==>启用(好像可以不用) 4.是否设置默认页面 5.其他的,百度. asp.net发布到IIS中出现错误:处理程序 ...
- 解决Firefox浏览器每次打开都弹出导入向导的问题
每次打开Firefox浏览器都会弹出导入向导这个页面,只有这个页面关闭后,Firefox界面才会打开. 解决办法: C:\Users\{用户名}\AppData\Roaming\Mozilla\Fir ...
- -Xmx 和 –Xms 设置最大堆和最小堆
C:\Java\jre1.6.0\bin\javaw.exe 按照上面所说的,最后参数在eclipse.ini中可以写成这个样子: -vmargs -Xms128M -Xmx512M ...
- ARM9代码分析启动MAIN.C
#define GLOBAL_CLK 1 #include <stdlib.h> #include <string.h> #include “def.h” #include “ ...
- oracle触发器及异常处理 简单例子
create sequence person_seq start with 1 increment by 1 order --按顺序 nocycle ...
- MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用
摘要: 第一阶段1~10篇已经覆盖了MVC开发必要的基本知识. 第二阶段11-20篇将会侧重于专题的讲解,一篇文章解决一个实际问题. 根据园友的反馈, 本篇文章将会先对呼声最高的仓储模式进行讲解. 文 ...
- python(三)set集合
set集合的特点是无序.不重复序列 创建集合: 1 2 3 4 5 6 7 8 9 10 11 12 13 a.s1 = {11,22} b.s2 = set() c.s3 = set([11,22, ...