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 ...
随机推荐
- html打造动画【系列3】- 小猫笑脸动画
猫咪容器 咱们每次画一个图片,肯定先要确定一个容器,几确定一下图形的位置和大小. <div class="mao_box"> <div class="m ...
- JavaScript standard 代码规范的全文
这是 JavaScript standard 代码规范的全文. 掌握本规范的最好方法是安装并在自己的代码中使用它. 细则 使用两个空格进行缩进. eslint: indent function hel ...
- Unable to load script from assets 'index.android.bundle' 出错?
野路子太多,坑人真的!F**k 言归正传,当你运行 react native 程序的时候出现这个错误 ,如果您使用Windows,请按以下方式运行命令,或者如果出现错误“无法找到条目文件index.a ...
- android studio *.apk does not exist on disk
Build -> Clean Project Restart Android Studio
- Android 后台线程,timertask实现定期更新时间
简述:这是一类定时功能的原型,用来在后台线程中运行一些定时的服务,比如定时修改时间 知识点: 1. Android多线程的消息通信(handler) 2. Java中时间的获取,以及String的格式 ...
- vue图片上传及java存储图片(亲测可用)
1.前言 在使用elementui的upload组件时,我一直无法做到上传的图片和其他数据一起提交.单纯的上传文件,java的存储图片的方式也有局限性. 我知道的后端保存图片有两种方式:一种是直接存储 ...
- HBase RegionServer宕机处理恢复
本文分析RegionServer宕机后这个region server上的region是如何在其他region server上恢复的. region server宕机后发生了什么 HMaster有一 ...
- 转:MVC框架
MVC框架是什么 MVC (Modal View Controler)本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是将M和V的实现代码分离,从而使 ...
- 搜索菜单栏侧滑效果控件SearchView
搜索菜单栏侧滑效果控件SearchView 本人视频教程系类 iOS中CALayer的使用 效果1: 效果2: 项目中用到的图片 bgImg@2x.png: 源码: SearchView.h + ...
- [翻译] AFSoundManager
AFSoundManager iOS audio playing (both local and streaming) and recording made easy through a comple ...