【转】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 ...
随机推荐
- c# 可变性解析(协变和逆变)
之所以会想写关于协变和逆变的知识点,主要是因为在泛型委托中提到了这个知识点. 1.什么是可变性 可变性是.NET4.0中的一个特性,可变形分为:协变性,逆变性,不可变性. 2.在.NET4.0出来之前 ...
- (转)苹果消息推送服务器 php 证书生成
1.准备好 aps_developer_identity.cer , push.p12这两个证书文件 2. 生成证书如下: openssl x509 -in aps_developer_identit ...
- 浅析NSTimer & CADisplayLink内存泄露
偶得前言 NSRunLoop与定时器 - invalidate的作用 我们如何解决? 偶得前言 本篇文章中我们主要谈谈NSTimer\CADisplayLink在使用过程中牵扯到内存泄露的相关问题及解 ...
- android与javascript相互调用
下面这一节来介绍android和javascript是怎么相互调用的,这样我们的UI界面设计起来就简单多了,而且UI设计起来也可以跨平台.现在有好多web app前台框架了,比如sencha和jque ...
- HDU 1501 & POJ 2192 Zipper(dp记忆化搜索)
题意:给定三个串,问c串是否能由a,b串任意组合在一起组成,但注意a,b串任意组合需要保证a,b原串的顺序 例如ab,cd可组成acbd,但不能组成adcb. 分析:对字符串上的dp还是不敏感啊,虽然 ...
- oracle tkprof 工具详解
oracle tkprof 工具详解 今天是2013-09-26,进行tkprof工具使用学习,在此记录一下笔记: 一)查看需要跟踪会话信息: select s.sid,s.serial#,s.us ...
- Multi-touch.
TP(Multi-touch). 1.Win7有6个版本,分别如下. Windows 7 Starter (初级版) 不支 ...
- 作业三 ATM
模拟实现一个ATM+购物商场程序 1.额度15000自定义 商城和银行两个帐户 2.实现购物商城,买东西加入购物车,调用信用卡接口结账 3.可以提现,手续费5%,提现额度不能超过50% 4.每月22日 ...
- CodeFirst解决数据迁移问题
CodeFirst解决数据迁移问题 分类: 数据库 设计模式 c#2013-04-24 17:56 137人阅读 评论(0) 收藏 举报 工程用的MVC + Entity Framework,根据Co ...
- jquery中attr与pror