HashMap对象的深层克隆
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对象的深层克隆的更多相关文章
- js的深层克隆和浅层克隆代码和理解
<script> //判断是不是原始值 //判断是数组还是对象 //建立相应的数组或对象 var obj={ name:'辣鸡', sex:'male', card:['laobi','f ...
- 10、匿名内部类、枚举类、日期、Math、Random、String、equals、StringBuffer、包装类、对象数组、克隆,标准输出3
1对象的克隆(clone) 单纯的同类的两个对象a0 a00,a0=a00只是栈指向同一个堆,而不是开辟两个新堆,修改其中一个,另一个也会受牵连. 需要重写Clone()方法,并且实现Cloneabl ...
- js对象的深度克隆
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- javascript中对象的深度克隆
记录一个常见的面试题,javascript中对象的深度克隆,转载自:http://www.2cto.com/kf/201409/332955.html 今天就聊一下一个常见的笔试.面试题,js中对象的 ...
- MyDAL - 引用类型对象 .DeepClone() 深度克隆[深度复制] 工具 使用
索引: 目录索引 一.API 列表 .DeepClone() 用于 Model / Entity / ... ... 等引用类型对象的深度克隆 特性说明 1.不需要对对象做任何特殊处理,直接 .Dee ...
- JAVA对象的深度克隆
有时候,我们需要把对象A的所有值复制给对象B(B = A),但是这样用等号给赋值你会发现,当B中的某个对象值改变时,同时也会修改到A中相应对象的值! 也许你会说,用clone()不就行了?!你的想法只 ...
- JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】
JavaScript实现对象的深度克隆 代码实现如下: <!DOCTYPE html> <html lang="en"> <head> < ...
- java中浅层克隆和深层克隆
1.浅复制与深复制概念 浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象 ...
- 1.__tostring()这个方法在类里可以直接输出对象。2.克隆对象的运用
<?php //__tostring()这个方法在类里的用途 能够直接输出对象 class Ren { public $name; function Run() { echo "跑&q ...
随机推荐
- windows registry => control pannel
User Variables HKEY_CURRENT_USER\Environment System Variables HKEY_LOCAL_MACHINE\SYSTEM\CurrentContr ...
- [ASP.NET MVC] Real-time之HTML5 服务器发送事件(server-sent event)
最近有时间,打算看看SignalR,顺便了解一下Server Sent Events. Controller 输出的数据格式为:data:[数据]\n\n.输出的数据尝试8000多字符也没问题,具体的 ...
- Mysql中的少用函数
1.查询时需要转换类型,大多发生在数字和字符串.时间和字符串之间 Mysql提供了两个个类型转换函数:CAST和CONVERT CAST() 和CONVERT() 函数可用来获取一个类型的值,并产生另 ...
- [转] 经典SQL练习题
原题目来自qaz13177_58_CSDN博客 http://blog.csdn.net/qaz13177_58_/article/details/5575711/#sql 只是更新个人答案供参考 表 ...
- 面试题-Stack的最小值o(1)
// Stack.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using names ...
- Android 获取渠道名称
直接看代码, //获取渠道名称public static String getChannelName(Activity ctx) { if (ctx == null) { return null; } ...
- windows programming can't find windows.h
在用控制台编译c++程序的时候,可能会遇到找不到windows.h的情况.这是因为我们在使用cl命令的时候,并没有配置好环境变量. 所以我们在运行cl命令之前,我们可以运行C:\Program Fil ...
- MVC5+EF6 入门完整教程
MVC5+EF6 入门完整教程11--细说MVC中仓储模式的应用 MVC5+EF6 入门完整教程10:多对多关联表更新&使用原生SQL@20150521 MVC5+EF6 入门完整教程9:多表 ...
- Arnold AtArray API Test
#include <ai.h> #include <iostream> #include <stdio.h> #include <vector> #in ...
- win7下matlab2016a配置libsvm
1.下载libsvm https://www.csie.ntu.edu.tw/~cjlin/libsvm/ 2.解压到matlab2016a的安装目录的toolbox下 例如我的D:\Program ...