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的复制的更多相关文章

  1. apache_commons 之 双向Map DualHashBidiMap (使用及源码)

    在项目当中,经常出现需要根据Key值获取value:而且要求根据value获取key值,其实在commons-collections包中已经提供了此集合类.就是DualHashBidiMap类. (官 ...

  2. hadoop中map和reduce的数量设置问题

    转载http://my.oschina.net/Chanthon/blog/150500 map和reduce是hadoop的核心功能,hadoop正是通过多个map和reduce的并行运行来实现任务 ...

  3. JAVA中关于Map的九大问题

    通常来说,Map是一个由键值对组成的数据结构,且在集合中每个键是唯一的.下面就以K和V来代表键和值,来说明一下java中关于Map的九大问题. 0.将Map转换为List类型 在java中Map接口提 ...

  4. Hadoop 中关于 map,reduce 数量设置

    map和reduce是hadoop的核心功能,hadoop正是通过多个map和reduce的并行运行来实现任务的分布式并行计算,从这个观点来看,如果将map和reduce的数量设置为1,那么用户的任务 ...

  5. Java map 详解 - 用法、遍历、排序、常用API等

    尊重原创: http://www.cnblogs.com/lzq198754/p/5780165.html 概要: java.util 中的集合类包含 Java 中某些最常用的类.最常用的集合类是 L ...

  6. Java Map 集合实现类

    Map 用于保存具有映射关系的数据,集合里会保存两组值,一组用于保存Map里的key,一组用于保存Map里的value,key与map可以是任何引用类型数据.Map的key不允许重复.key与valu ...

  7. 如何确定 Hadoop map和reduce的个数--map和reduce数量之间的关系是什么?

    1.map和reduce的数量过多会导致什么情况?2.Reduce可以通过什么设置来增加任务个数?3.一个task的map数量由谁来决定?4.一个task的reduce数量由谁来决定? 一般情况下,在 ...

  8. 内核编译之vmlinuz vmlinux system.map initrd

    一.vmlinuz  vmlinuz是可引导的.压缩的内核.“vm”代表“Virtual Memory”.Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制.Linux能够使用 ...

  9. java Map常用方法封装

      java Map常用方法封装 CreationTime--2018年7月16日15点59分 Author:Marydon 1.准备工作 import java.util.HashMap; impo ...

随机推荐

  1. spring代理例子

    ---------------------------------------------------------- 先来看一下目录结构 显然service里面有两个java文件,UserDao是接口 ...

  2. Git——克隆部分文件

    在进行项目开发的时候,有时候会有这样的需求那就是:我们只希望从Git仓库里取指定的文件或者文件夹出来.在SVN里面,这非常容易实现,因为SVN基于文件方式存储,而Git却是基于元数据方式分布式存储文件 ...

  3. 网络I/O模型--07Netty基础

    Netty 是由 JBOSS 提供的一个 Java 开源框架. Netty 提供异步的.事件驱动的网络应用程序框架和工具 ,用以快速开发高性能 . 高可靠性的网络服务器和客户端程序.      Net ...

  4. 进度条(Progressbar)

    进度条(Progressbar) 提供如下一些样式改变进度条的外观 @android:style/Widget.ProgressBar.Horizontal(水平进度条) @android:style ...

  5. 杀死进程-LeetCode-582

    英文版 582. Kill ProcessGiven n processes, each process has a unique PID (process id) and its PPID (par ...

  6. C语言图形编程

    四.图形和图像函数(一) 像素函数    56. putpiel() 画像素点函数    57. getpixel()返回像素色函数(二) 直线和线型函数    58. line() 画线函数    ...

  7. 机器学习中正则惩罚项L0/L1/L2范数详解

    https://blog.csdn.net/zouxy09/article/details/24971995 原文转自csdn博客,写的非常好. L0: 非零的个数 L1: 参数绝对值的和 L2:参数 ...

  8. 从Azure上构建Windows应用程序映像

    从Azure上构建windows应用程序映像同构建Linux应用程序映像总体流程比较类似,可以参考上图Linux映像的制作发布等流程,具体细节又有所差别. 具体步骤如下: 从Azure管理平台上申请W ...

  9. Windows Pre-commit hook for comment length Subversion

    @echo off :: Stops commits that have empty log messages. @echo off setlocal rem Subversion sends thr ...

  10. [翻译] NSRegexTester

    NSRegexTester This is a very simple Mac OS X application that allows you to test regular expressions ...