Map的复制
Map的复制不可以直接使用=赋值
Map<String,Object> map1 = new HashMap<String,Object>();
Map<String,Object> copy = new HashMap<String,Object>();
map1.put("木了洋", "李振洋");
System.out.println(map1.get("木了洋"));
copy = map1;
copy.remove("木了洋");
System.out.println(map1.get("木了洋"));
输出结果为:李振洋 null
这种的复制只是对象引用的变化,两个变量其实指的是同一个对象,在内存中占用同一块内存。所以在copy移除时map1的值也移除了。
Map的putall方法可以实现map的浅复制,当值都是基本数据类型时,map的putall方法可以实现map的深复制。但是如果值是引用类型的时候就出现问题了。
Map<String,Object> map1 = new HashMap<String,Object>();
Map<String,Object> copy = new HashMap<String,Object>();
map1.put("木了洋", "李振洋");
System.out.println(map1.get("木了洋"));
copy.putAll(map1);
copy.remove("木了洋");
System.out.println(map1.get("木了洋"));
输出结果为:李振洋 李振洋
Map<String,Object> map1 = new HashMap<String,Object>();
Map<String,Object> copy = new HashMap<String,Object>();
Map<String,Object> subMap = new HashMap<String,Object>();
subMap.put("prinkey", "yue");
subMap.put("kwin", "yang");
subMap.put("katto", "fan");
subMap.put("didi", "chao");
map1.put("fan", "55667788");
map1.put("bc221", subMap); copy.putAll(map1);
System.out.println("initialization data:----------------");
System.out.println(map1);
System.out.println(copy); subMap.put("mk", "mianku");
map1.put("fan", "nzdm");
System.out.println("after update data:----------------");
System.out.println(map1);
System.out.println(copy);
输出结果为:
可以看到的时当map里面的当基本数据类型发生变化时,copy并没有受到影响。但是引用数据类型发生改变时,copy的值也跟随变化了!
所以并没有实现真正的复制。
实现map的深复制,需要用到对象的克隆方法,用流的方式进行复制操作。但是不仅限于map的复制,只要实现了 Serializable接口的类都可以用如下方法进行复制操作。比如说你自己定义的类,实现 Serializable接口也可以这个方法进行深复制了。
public static <T extends Serializable> T clone(T obj) {
T cloneObj = null;
try {
// 写入字节流
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream obs = new ObjectOutputStream(out);
obs.writeObject(obj);
obs.close(); // 分配内存,写入原始对象,生成新对象
ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
ObjectInputStream ois = new ObjectInputStream(ios);
// 返回生成的新对象
cloneObj = (T) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
return cloneObj;
}
Map的复制的更多相关文章
- apache_commons 之 双向Map DualHashBidiMap (使用及源码)
在项目当中,经常出现需要根据Key值获取value:而且要求根据value获取key值,其实在commons-collections包中已经提供了此集合类.就是DualHashBidiMap类. (官 ...
- hadoop中map和reduce的数量设置问题
转载http://my.oschina.net/Chanthon/blog/150500 map和reduce是hadoop的核心功能,hadoop正是通过多个map和reduce的并行运行来实现任务 ...
- JAVA中关于Map的九大问题
通常来说,Map是一个由键值对组成的数据结构,且在集合中每个键是唯一的.下面就以K和V来代表键和值,来说明一下java中关于Map的九大问题. 0.将Map转换为List类型 在java中Map接口提 ...
- Hadoop 中关于 map,reduce 数量设置
map和reduce是hadoop的核心功能,hadoop正是通过多个map和reduce的并行运行来实现任务的分布式并行计算,从这个观点来看,如果将map和reduce的数量设置为1,那么用户的任务 ...
- Java map 详解 - 用法、遍历、排序、常用API等
尊重原创: http://www.cnblogs.com/lzq198754/p/5780165.html 概要: java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 L ...
- Java Map 集合实现类
Map 用于保存具有映射关系的数据,集合里会保存两组值,一组用于保存Map里的key,一组用于保存Map里的value,key与map可以是任何引用类型数据.Map的key不允许重复.key与valu ...
- 如何确定 Hadoop map和reduce的个数--map和reduce数量之间的关系是什么?
1.map和reduce的数量过多会导致什么情况?2.Reduce可以通过什么设置来增加任务个数?3.一个task的map数量由谁来决定?4.一个task的reduce数量由谁来决定? 一般情况下,在 ...
- 内核编译之vmlinuz vmlinux system.map initrd
一.vmlinuz vmlinuz是可引导的.压缩的内核.“vm”代表“Virtual Memory”.Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制.Linux能够使用 ...
- java Map常用方法封装
java Map常用方法封装 CreationTime--2018年7月16日15点59分 Author:Marydon 1.准备工作 import java.util.HashMap; impo ...
随机推荐
- 原型相关的方法isPrototypeOf、Object.getPrototypeOf、hasOwnProperty、Object.getOwnPropertyName、Object.keys
在看<高程3>第六章的<面向对象的程序设计>的原型那一节时,有一下5个函数,功能较为接近,但是又都很基础,很重要 所以在此,加以说明,以便日后复习 function Perso ...
- js和jquery中获取非行间样式
样式又分为了行间样式和非行间样式.一般来说行间样式用的是比较少的,因为它能够作用的范围就只有一个元素,而非行间样式的作用范围可以是一类元素(即拥有相同德标签,或者说是有相同的类名,(当然id名不可能相 ...
- 浏览器根对象navigator之对象属性概览
第1章 connection[试验] navigator.connection 是只读的,提供一个NetworkInformation 对象来获取设备的网络连接信息.例如用户设备的当前带宽或连接是否被 ...
- mac os idea的快捷键
全局搜索:shift+command+f 搜索类:command+o 光标向前向后移动:command+option+(左/右) 删除一行: command+delete
- eventbus3-intellij-plugin插件搜不到
一.eventbus3-intellij-plugin插件搜不到
- 在Fragment里面调用getActivity()报null
看友盟的错误日志发现又出现了NullPointerException,然后去看代码,发现只有是上下文有空的可能,但是因为以前已经发生过这种情况所以上下文我都是在创建Fragment对象的时候从Acti ...
- 记录一次测试环境遇到的push消息记录
测试环境测试push消息,调用消息中心同事的api接口,感觉怎么都调用不通.纠结了一天,最终发现原因:一是版本的问题,不同的测试包有不同的版本,不同的版本 可能push的消息不同.二是 用户有没有 开 ...
- Array类型
Array类型 Array也是ECMAScript中常用类型之一,其特点是数组中的每一项都可以保存任何类型的数据,数组的大小可以动态调整. 创建数组 方式1:使用Array构造函数 var books ...
- Oracle EBS 请求添加SQL语句
- Oracle 18c新特性一览
1. 一般新特性 1.1. Shadow Lost Write Protection Shadow lost write protection检测到一个丢失的写,它会导致一个主要的数据损坏.可以在不需 ...