【转】Java如何克隆集合——深度拷贝ArrayList和HashSet
原文网址:http://blog.csdn.net/cool_sti/article/details/21658521
原英文链接:http://javarevisited.blogspot.hk/2014/03/how-to-clone-collection-in-java-deep-copy-vs-shallow.html
Java集合中的深度拷贝
- import java.util.Collection;
- import java.util.HashSet;
- import java.util.Iterator;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- /**
- * Java program to demonstrate copy constructor of Collection provides shallow
- * copy and techniques to deep clone Collection by iterating over them.
- * @author http://javarevisited.blogspot.com
- */
- public class CollectionCloningTest {
- private static final Logger logger = LoggerFactory.getLogger(CollectionCloningclass);
- public static void main(String args[]) {
- // deep cloning Collection in Java
- Collection org = new HashSet();
- org.add(new Employee("Joe", "Manager"));
- org.add(new Employee("Tim", "Developer"));
- org.add(new Employee("Frank", "Developer"));
- // creating copy of Collection using copy constructor
- Collection copy = new HashSet(org);
- logger.debug("Original Collection {}", org);
- logger.debug("Copy of Collection {}", copy );
- Iterator itr = org.iterator();
- while(itr.hasNext()){
- itr.next().setDesignation("staff");
- }
- logger.debug("Original Collection after modification {}", org);
- logger.debug("Copy of Collection without modification {}", copy );
- // deep Cloning List in Java
- }
- }
- class Employee {
- private String name;
- private String designation;
- public Employee(String name, String designation) {
- this.name = name; this.designation = designation;
- }
- public String getDesignation() {
- return designation;
- }
- public void setDesignation(String designation) {
- this.designation = designation;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override public String toString() {
- return String.format("%s: %s", name, designation );
- }
- }
输出:
- - Original Collection [Joe: Manager, Frank: Developer, Tim: Developer]
- - Copy of Collection [Joe: Manager, Frank: Developer, Tim: Developer]
- - Original Collection after modification [Joe: staff, Frank: staff, Tim: staff]
- - Copy of Collection without modification [Joe: staff, Frank: staff, Tim: staff]
- @Override
- protected Employee clone() {
- Employee clone = null;
- try{
- clone = (Employee) super.clone();
- }catch(CloneNotSupportedException e){
- throw new RuntimeException(e); // won't happen
- }
- return clone;
- }
- Collection<Employee> copy = new HashSet<Employee>(org.size());
- Iterator<Employee> iterator = org.iterator();
- while(iterator.hasNext()){
- copy.add(iterator.next().clone());
- }
- - Original Collection after modification [Joe: staff, Tim: staff, Frank: staff]
- - Copy of Collection without modification [Frank: Developer, Joe: Manager, Tim: Developer]
【转】Java如何克隆集合——深度拷贝ArrayList和HashSet的更多相关文章
- Java对象和集合的拷贝/克隆/复制
昨天同事遇到了一个奇怪的问题,他需要将一个JavaBean拷贝一份,然后对新创建的Bean进行操作.但是他对新的Bean操作后,会影响旧的Bean的值.当听到这个问题的时候,我第一反应就是他的拷贝方法 ...
- Java中的集合List、ArrayList、Vector、Stack(三)
List接口 List集合代表一个有序集合,集合中每一个元素都有其对应的顺序索引.List集合容许使用重复元素,可以通过索引来访问指定位置的集合对象. ArrayList和Vector实现类 Arra ...
- java集合专题 (ArrayList、HashSet等集合底层结构及扩容机制、HashMap源码)
一.数组与集合比较 数组: 1)长度开始时必须指定,而且一旦指定,不能更改 2)保存的必须为同一类型的元素 3)使用数组进行增加/删除元素-比较麻烦 集合: 1)可以动态保存任意多个对象,使用比较方便 ...
- java基础之集合框架--使用ArrayList类动态 存储数据
一.ArrayList是List接口下的一个实现类,实现了长度可变的.连续的数组:拥有数组的特性. 遵循了LIst的规则:不唯一的.有序的. 如果没有增加泛型的话,集合中可以添加任何类型的数据. 使用 ...
- Java泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap
声明:以下源代码使用的都是基于JDK1.8_112版本 1. ArrayList源码解析 <1. 集合中存放的依然是对象的引用而不是对象本身,且无法放置原生数据类型,我们需要使用原生数据类型的包 ...
- java基础之集合长度可变的实现原理
首先我们要明白java中的集合Collection,List,ArrayList之间的关系: ArrayList是具体的实现类,实现了List接口 List是接口,继承了Collection接口 Li ...
- Java中如何克隆集合——ArrayList和HashSet深拷贝
编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法.需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味 ...
- java集合系列之三(ArrayList)
上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayLi ...
- Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
随机推荐
- 深入理解linux网络技术内幕读书笔记(九)--中断与网络驱动程序
Table of Contents 1 接收到帧时通知驱动程序 1.1 轮询 1.2 中断 2 中断处理程序 3 抢占功能 4 下半部函数 4.1 内核2.4版本以后的下半部函数: 引入软IRQ 5 ...
- redis报错
网站登录异常,redis数据不能写!解决方法汇总! redis---flushdb ###提示如下错误 ###flushall 清空说有数据,所有库 (error) ...
- 常用的MIME类型(资源的媒体类型)
后缀名 MIME名称 *.3gpp audio/3gpp, video/3gpp *.ac3 audio/ac3 *.asf allpication/vnd.ms-asf *.au audio/bas ...
- (转)OS X Mountain Lion 系统配置 Apache+Mysql+PHP 详细教程
如果你是一名 Web 开发者,很多时候都需要在本地搭建服务器测试环境,比如 Apache+Mysql+PHP 这样的环境.事实上 Mac OS X 中想要搭建这样的环境很简单,本文我们就会将详细的教程 ...
- 你需要知道的九大排序算法【Python实现】源码
#coding: utf-8 #!/usr/bin/python import randomimport math #随机生成0~100之间的数值def get_andomNumber(num): l ...
- [shell]Shell经常使用特殊符号
符合 含义 && command1 && command2:命令1返回真(命令返回值 $? == 0)后,命令2才干被运行.能够用于if推断. cp 1.txt ../ ...
- AxisFault另外一个问题
出现以下情况,能够是proxy.setEndpoint(endpoint);中endpoint不正确导致 因该是:endpoint = http://127.0.0.1/8080/项目名/servic ...
- Oracle 11g新特性invisible index(不可见的索引)
假设一张表上有十几个索引,你有什么感受?显然会拖慢增.删.改的速度.不要指望开发者能建好索引.我的处理方法是先监控非常长的一段时间.看哪些索引没实用到,然后删除. 但删除以后,假设发现某一天实用,那又 ...
- Electron开发环境部署
Electron开发环境部署 安装node.js 可以从node.js官方网站上获取安装包,并进行安装,安装完可以通过 ndoe -v 指令进行版本查看. 本文的开发环境为node.js 4.4.5. ...
- 关于获得本机Mac Address的方法
网络上有讲获得Mac address的方法有如下: 1. 发送ARP命令,利用返回的Mac Address缓冲区得到 2. 用NetworkInterface.GetAllNetworkInterfa ...