1.java.util.HashMap 的 clone 方法是浅层copy,clone出来的对象,仅仅是原来对象的一个引用,并且对克隆出来的对象进行操作是无效的。

下面是个例子:

    import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; /**
* @author hzp
*
*/
public class Test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub HashMap source = new HashMap();
source.put("key1","value1");
source.put("key2","value2"); for(Iterator keyItr = source.keySet().iterator();keyItr.hasNext();) {
Object key = keyItr.next();
System.out.println(key + " : "+source.get(key));
}
System.out.println("----------------- 1 ----------------"); Map targetMap = (HashMap)source.clone(); for(Iterator keyItr = targetMap.keySet().iterator();keyItr.hasNext();){
Object key = keyItr.next();
System.out.println(key + " : "+source.get(key));
} System.out.println("---------------- 2 ----------------"); Object temp = targetMap.put("key1","modify");
System.out.println("temp : "+temp); for(Iterator keyItr = source.keySet().iterator();keyItr.hasNext();){
Object key = keyItr.next();
System.out.println(key + " : "+source.get(key));
}
} } 输出结果为: key1 : value1
key2 : value2
----------------- 1 ----------------
key1 : value1
key2 : value2
---------------- 2 ----------------
temp : value1
key1 : value1
key2 : value2 若想实现深层copy,则需要自己重写clone方法。 如下面的例子: import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; /**
* @author hzp
*
*/
public class Test { class customHashMap extends HashMap { public customHashMap() {
super();
} public customHashMap(int initialCapacity) {
super(initialCapacity);
} public Object clone() {
Map target = new HashMap();
for (Iterator keyIt = this.keySet().iterator(); keyIt.hasNext();) {
Object key = keyIt.next();
target.put(key, this.get(key));
}
return target;
}
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub customHashMap source = (new Test()).new customHashMap();
source.put("key1", "value1");
source.put("key2", "value2"); for (Iterator keyItr = source.keySet().iterator(); keyItr.hasNext();) {
Object key = keyItr.next();
System.out.println(key + " : " + source.get(key));
} System.out.println("----------------- 1 ----------------"); Map target = (Map) source.clone();
target.put("key1", "modify"); System.out.println("----------------- 2 the souce map print----------------");
for (Iterator keyItr = source.keySet().iterator(); keyItr.hasNext();) {
Object key = keyItr.next();
System.out.println(key + " : " + source.get(key));
} System.out.println("----------------- 3 the target map print----------------");
for (Iterator keyItr = target.keySet().iterator(); keyItr.hasNext();) {
Object key = keyItr.next();
System.out.println(key + " : " + target.get(key));
} } } 输出结果: key1 : value1
key2 : value2
----------------- 1 ----------------
----------------- 2 the souce map ----------------
key1 : value1
key2 : value2
----------------- 3 the target map ----------------
key1 : modify
key2 : value2

HashMap对象的深层克隆的更多相关文章

  1. js的深层克隆和浅层克隆代码和理解

    <script> //判断是不是原始值 //判断是数组还是对象 //建立相应的数组或对象 var obj={ name:'辣鸡', sex:'male', card:['laobi','f ...

  2. 10、匿名内部类、枚举类、日期、Math、Random、String、equals、StringBuffer、包装类、对象数组、克隆,标准输出3

    1对象的克隆(clone) 单纯的同类的两个对象a0 a00,a0=a00只是栈指向同一个堆,而不是开辟两个新堆,修改其中一个,另一个也会受牵连. 需要重写Clone()方法,并且实现Cloneabl ...

  3. js对象的深度克隆

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. javascript中对象的深度克隆

    记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...

  5. MyDAL - 引用类型对象 .DeepClone() 深度克隆[深度复制] 工具 使用

    索引: 目录索引 一.API 列表 .DeepClone() 用于 Model / Entity / ... ... 等引用类型对象的深度克隆 特性说明 1.不需要对对象做任何特殊处理,直接 .Dee ...

  6. JAVA对象的深度克隆

    有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值! 也许你会说,用clone()不就行了?!你的想法只 ...

  7. JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】

    JavaScript实现对象的深度克隆 代码实现如下: <!DOCTYPE html> <html lang="en"> <head> < ...

  8. java中浅层克隆和深层克隆

    1.浅复制与深复制概念 浅复制(浅克隆)     被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象 ...

  9. 1.__tostring()这个方法在类里可以直接输出对象。2.克隆对象的运用

    <?php //__tostring()这个方法在类里的用途 能够直接输出对象 class Ren { public $name; function Run() { echo "跑&q ...

随机推荐

  1. maven打包日志输出优化-去掉泛型与过时的警告

    pom.xml配置 1.使用eclipse编译 <!-- Eclipse编译代码时,使用的是自带的JDT(Java Development Tools), 而Maven默认使用的是JAVA_HO ...

  2. Java程序员学习之路

    1. Java语言基础 谈到Java语 言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基 ...

  3. TCPReplay使用---张子芳

    TCPReplay主要功能是将PCAP包重新发送,用于性能或者功能测试.但是在测试环境与原转包系统结构一般是不同的.比如被测试机的二层MAC地址与抓包机器的MAC不同,所以被测试机在二层处理时发现目的 ...

  4. [MacOS] 终端使用ssh时,中文乱码问题处理

    终端显示中文问题处理: vim ~/.inputrc 加入以下代码 set meta-flag on set convert-meta off set input-meta on set output ...

  5. .net之工作流工程展示及代码分享(二)工作流引擎

    在介绍完表单类的时候,接下来介绍工作流引擎,主要由四个类组成,分别是流程.流程步骤.流程实例.流程步骤实例类. 流程类: [Serializable] public class Flow { [Xml ...

  6. AC6102 DDR2测试工程

    AC6102 DDR2测试工程 本文档介绍AC6102上DDR2存储器基于Verilog代码的测试过程.AC6102上使用了2片16bit的DDR2存储器组成了32bit的硬件总线.虽然是32bit硬 ...

  7. 调试必备---console

    一.前言 可能很多前端er会习惯用 alert() 方法来进行调试,但我相信更多的人会使用 console.log(),因为它不用像 alert() 那样会有字符长度限制,也不会中止程序的进程,而且还 ...

  8. jdbc的实例应用:增删查改实现

    //在jdbc中进行增删查改 //查看所有 public static void findAll() { String url = "jdbc:mysql://localhost:3306/ ...

  9. session详解

    什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端 ...

  10. BCP 导出导入数据(SQL Server)

    BCP指令工具可通过安装SQL Server获得. 1. 根据现有的数据库生成表的format文件(导入导出数据的时候需要) bcp db_test.dbo.Table1 format nul -c ...