java 复制Map对象(深拷贝与浅拷贝)
java 复制Map对象(深拷贝与浅拷贝)
CreationTime--2018年6月4日10点00分
Author:Marydon
1.深拷贝与浅拷贝
浅拷贝:只复制对象的引用,两个引用仍然指向同一个对象,在内存中占用同一块内存;
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象;
换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量;
那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象;
换言之,深复制把要复制的对象所引用的对象都复制了一遍。
2.通过putAll()方法能够实现浅拷贝与深拷贝
使用Map对象只能实现浅拷贝
public static void main(String[] args) {
// Map只能实现浅拷贝,paramMap中的内容发生变化,paramMap2中的内容亦同步发生变化
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("name", "Marydon");
Map<String, String> paramMap2 = new HashMap<String, String>();
// 实现浅拷贝方式一:使用=
paramMap2 = paramMap;
paramMap.remove("name");
System.out.println(paramMap2);//{}
// 实现浅拷贝方式二:使用Map.putAll()
paramMap2.putAll(paramMap);
paramMap.remove("name");
System.out.println(paramMap2);//{}
}
使用HashMap对象可是实现深拷贝
public static void main(String[] args) {
// HashMap可以实现真正意义上深拷贝,注意不是Map
HashMap<String, String> paramMap = new HashMap<String, String>();
paramMap.put("name", "Marydon");
HashMap<String, String> paramMap2 = new HashMap<String, String>();
// 实现深拷贝:使用HashMap.putAll()
paramMap2.putAll(paramMap);
paramMap.remove("name");
System.out.println(paramMap2);// {name=Marydon}
}
3.小结
实现浅拷贝的方式有两种:=和Map.putAll();
实现深拷贝:HashMap.putAll()。
大多数情况下,我们需要实现的是深拷贝而不是浅拷贝;
使用Map调用putAll()方法,并不是真正意义上的拷贝,Map对象B只是对Map对象A进行了引用,当Map对象A中的内容发生变化时,Map对象B也会发生变化;
使用HashMap调用putAll()方法才是真正意义上的拷贝。
java 复制Map对象(深拷贝与浅拷贝)的更多相关文章
- javascript对象深拷贝,浅拷贝 ,支持数组
javascript对象深拷贝,浅拷贝 ,支持数组 经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One meth ...
- 复制Map对象:Map.putAll方法
复制Map对象:Map.putAll方法 Map.putAll方法可以追加另一个Map对象到当前Map集合 package xmu.sxl; import java.util.HashMap; imp ...
- 将java中Map对象转为有相同属性的类对象(json作为中间转换)
java中Map对象转为有相同属性的类对象(json作为中间转换) 准备好json转换工具类 public class JsonUtil { private static ObjectMapper o ...
- Java clone() 方法克隆对象——深拷贝与浅拷贝
基本数据类型引用数据类型特点 1.基本数据类型的特点:直接存储在栈(stack)中的数据 2.引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里 引用数据类型在栈中存储了指针,该指 ...
- 也来玩玩 javascript对象深拷贝,浅拷贝
经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One method of copying an object is ...
- js对象深拷贝、浅拷贝
浅拷贝1 //浅拷贝1 let obj01 = { name: 'Lily', age: '20', time: ['13', '15'], person: { name: 'Henry', age: ...
- 死磕Java面试系列:深拷贝与浅拷贝的实现原理
深拷贝与浅拷贝的问题,也是面试中的常客.虽然大家都知道两者表现形式不同点在哪里,但是很少去深究其底层原理,也不知道怎么才能优雅的实现一个深拷贝.其实工作中也常常需要实现深拷贝,今天一灯就带大家一块深入 ...
- Java遍历Map对象的四种方法
在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHa ...
- 一文搞懂Java引用拷贝、深拷贝、浅拷贝
刷题.面试中,我们可能会遇到将一个对象的属性赋值到另一个对象的情况,这种情况就叫做拷贝.拷贝与Java内存结构息息相关,搞懂Java深浅拷贝是很必要的! 在对象的拷贝中,很多初学者可能搞不清到底是拷贝 ...
随机推荐
- VS增强插件 Supercharger破解教程
Supercharger 破解教程:步骤:1.打开Supercharger的options; 2.点击Pricing & Registration 3.复制 license tt4e2HN4X ...
- UI----------------Toggle
Is On:是否已经勾选上了 Toggle Transition:渐变效果 Graphic:勾选标志的图,就是那个勾 Group:多选组 On Value Changed:当选项改变时,触发事件 多选 ...
- Python脚本报错AttributeError: 'module' object has no attribute 'maketrans'
出现此错误的原因:是此文件smtp02.py 所在的目录下有string.pyc 的文件存在,与python库里的string.pyc冲突造成无法确认编译所取的类库.
- 【postman】postman访问zuul路由网关,发生Could not get any response 的情况
情况如下: zuul配置的自定义过滤器,对所有由zuul进行路由转发的请求进行安全验证,如果请求中包含auth,则成功路由,否则失败. 代码如下: package com.swapping.sprin ...
- html 中怎么设置div的位置
利用CSS的position属性对元素定位,以下是position 属性规定元素的定位类型. absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位.元素的位置通过 ...
- jQueryEasyUI创建菜单主页
function addTab(title,path){ funcTab.tabs('add',{ title: title, fit:true, href:'${ctx}/login/forword ...
- Flatten Binary Tree to Linked List leetcode java
题目: Given a binary tree, flatten it to a linked list in-place. For example, Given 1 / \ 2 5 / \ \ 3 ...
- AS 代码模板 文件模板 Templates MD
修改 File and Code Templates Settings –> Editor –>[File and Code Templates] 或者在右键new时选择子菜单[Edite ...
- 【用jQuery来判断浏览器的类型】及【javascript获取用户ip地址】
用jQuery来判断浏览器的类型,主要是使用$.browser这个工具类,使用方法: $.browser.['浏览器关键字'] //谷歌浏览器.360浏览器等其他一些浏览器,没有专门的判断 funct ...
- Div+Css实现段落首行缩进两个字符(text-indent标签)
段落前面空两个字的距离,不要再使用空格了,用CSS实现段落首缩进两个字符.应该使用首行缩进text-indent.text-indent可以使得容器内首行缩进一定单位.比如中文段落一般每段前空两个汉字 ...