Map拷贝 关于对象深拷贝 浅拷贝的问题

上面程序的期望输出值是,
mapFrist的值均为1,
但是实际上输出结果为:
{key1=1}
{key2=2, key1=1}

这里是因为map发生了浅拷贝,mapFirst只是复制了map的引用,和map仍使用同一个内存区域,所以,在修改map的时候,mapFirst的值同样会发生变化。
浅复制:则是只复制对象的引用,两个引用仍然指向同一个对象,在内存中占用同一块内存。被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

如何解决?
使用深拷贝,拷贝整个对象,而非引用
Map中有个方法叫做putAll方法,可以实现深拷贝,如下

如上,输出结果为:
{key1=1}
{key1=1}

时间: 2024-11-01 17:07:56

Map拷贝 关于对象深拷贝 浅拷贝的问题的相关文章

C#对象的浅拷贝,深拷贝

C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量,对于值类型变量,深拷贝和前拷贝都是通过赋值操作符号(=)实现,其效果一致,将对象中的值类型的字段拷贝到新的对象中.这个很容易理解. 本文重点讨论引用类型变量的拷贝机制和实现. C#中引用类型对象的copy操作有两种: 浅拷贝(影子克隆/shallow copy):只复制对象的值类型字段,对象的引用类型,仍属于原来的引用. 深拷贝(深度克隆):不仅复制对象的值类型字段,同时也复制原对象中的对象.就是说完全是新对象产生的. 浅拷贝和深拷贝

C#对象的浅拷贝,深拷贝及利用序列化等多种方式实现深拷贝

C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量,对于值类型变量,深拷贝和前拷贝都是通过赋值操作符号(=)实现,其效果一致,将对象中的值类型的字段拷贝到新的对象中.这个很容易理解. 本文重点讨论引用类型变量的拷贝机制和实现. C#中引用类型对象的copy操作有两种: 浅拷贝(影子克隆/shallow copy):只复制对象的值类型字段,对象的引用类型,仍属于原来的引用. 深拷贝(深度克隆):不仅复制对象的值类型字段,同时也复制原对象中的对象.就是说完全是新对象产生的. 浅拷贝和深拷贝

Map中查询对象

问题描述 我在map中key存放对象的主键值,value存放对象(不知道对象有几个属性).我要可以实现任意一个属性或属性的任意组合在map中查询对象.可以写多个方法. 问题补充:AngelAndAngel 写道 解决方案 假如要足够动态的话 用反射实现 你的value不是存入的对象吗,那么在传入属性名和值之后,根绝对象的getFields()得出所有属性来匹配,匹配出来的属性(一个或者多个)动态调用get方法,然后和你传入的值来做比较,假如符合,则是此主键索引的对象.这里要注意的就是,你传入的值

JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中,也是能看到他的,所以还是非常值得去学习的一个知识点的,我们直接开车了 一.Map概述 泛型< k,v> 键值对,映射关系 基本特点 该集合存储键值对,是一对一对往里存,而且要保证键的唯一性 1.添加 put(key ,values) putAll() 2.删除 clear() remove(ob

【js jQuery】map集合 循环迭代取值---以及 map、json对象、list、array循环迭代的方法和区别

后台给前台传来一个map @ResponseBody @RequestMapping(value = "getSys") public Map<Long,String> getSys(){ Map<Long,String> map = orderService.getSysDate(); return map; }   前台js中怎么迭代呢?[注意each的使用]这只是一种方法,如果想看更多的方法和各个方法的区别,请往下看分割2. $.post("ge

js对象的浅拷贝和深拷贝

浅拷贝是直接复制源对象的属性和方法. 深拷贝是在浅拷贝的基础上,如果源对象属性也是一个对象,那么连这个对象也复制,也就是在内存中又开辟了一块地方用来存放. 下面是浅拷贝的代码示例: function extend (a, b){ //a为目标的对象名,b为源对象名 for(var i in b){     a[i] = b[i] }     return a; } 深拷贝的代码暂时没写出来,有兴趣的可以去看一下JQ的源码,里面有相应的代码$.extends. 一.数组的深浅拷贝 在使用JavaS

最高效率的对象深拷贝通用方法

问题描述 曾有人发帖要高效的对象拷贝通用方法,当时只给了一个简单类型的拷贝,现在挤出点时间完成了这个功能,内部的引用类型依次深度拷贝.完整代码见博客:这里发帖收集建议意见,简单的测试了下,已经非常完美的运行了,目前能支持任何带无参数的构造函数的类的深拷贝,一元数组的深拷贝,数组和类的循环嵌套深拷贝(即父子关系的类,或双向链表).感兴趣的朋友,可以研究下Emit部分,这是C#的精华,也是能够提高效率的必备利器,嫌.NET慢的人不要光抱怨,那是因为你们不懂优化代码,会了Emit就可以最高限度的优化代

map插入自定义对象总结_C 语言

难道插入map还有什么讲究吗?我们且看map在STL中的定义方法:template <class Key, class T, class Compare = less<Key>, class Alloc = alloc>第一个参数Key是关键字类型第二个参数T是值类型第三个参数Compare是比较函数(仿函数)第四个参数是内存配置对象 map内部存储机制实际是以红黑树为基础,红黑树在插入节点时,必须依照大小比对之后在一个合适的位置上执行插入动作.所以作为关键字,起码必须有"

Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍_java

深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复制)和浅拷贝(浅复制),我们还是要给予足够的重视,因为有时这两个概念往往会给我们带来不小的困惑. 浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象.深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象.举例来说更加清楚:对象A1中包含对B1的引用