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 ...
随机推荐
- 导出Excel And 导出word
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default6.aspx. ...
- JavaScript中数组操作常用方法
JavaScript中数组操作常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2 ...
- Kolmogorov-Smirnov检验
Kolmogorov-Smirnov检验(K-S检验)基于累积分布函数,用以检验一个经验分布是否符合某种理论分布或比较两个经验分布是否有显著性差异. 两样本K-S检验由于对两样本的经验分布函数的位置和 ...
- MongoDB - 在Windows上安装
1 下载MongoDB社区版, 下载链接 http://www.mongodb.org/downloads?_ga=1.129742796.1997610832.1481940266 2 安装Mong ...
- ImageLoader加载图片
先导universal-image-loader-1.9.3包 在application配置 android:name=".MyApplication" intent权限 1 pa ...
- Monkey的ADB命令简单使用示例和解析
进行简单的压力测试: 1. adb shell monkey –p 包名 –v-v 3000 >E:\bugLog.txt -v -v 标识打印的日志的详细级别为2级,更高级有3级,也可以用1级 ...
- 关于iBatis.NET连接各数据库时提示没找到数据库驱动的依赖文件
iBatis.net在连接oracle数据库时使用的是:oracleClient1.0 这个是系统自带的驱动,配置上即可,使用的连接配置为: <database> <provider ...
- Python作业 1
用户有三次机会登录,登录成功,显示欢迎界面. 三次登录失败,账户被锁定,下次登录失败. 思路: 1:流程控制:for或者while循环,达到三次检测目的. 2:文件操作. 检测文档,一旦发现输入账户名 ...
- stm32 cubemx hal 工程中 微秒延迟 delay_us
参考的正点原子的代码 测试平台 stm32f429i-disco 配了一个gpio 时钟 gpio /* USER CODE BEGIN 0 */ typedef uint8_t u8; typede ...
- Spring获取bean的工具类
package com.tech.jin.util; import org.springframework.context.ApplicationContext; import org.springf ...