修改Map中确定key对应的value问题
今天在码代码的时候出现一个没有预料的问题:
先看下面的代码:
public static void main(String[] args) {
String[] files=new String[]{"abcd","qwer","asdf"};
Map<String,Object> map=new HashMap<String,Object>();
map.put("file", "12345");
map.put("id", 15);
map.put("name", "works");
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
for (int i = 0; i < files.length; i++) {
list.add(map);
list.get(i).put("file", files[i]);
}
System.out.println(list.toString());
}
这里map模拟从数据库取到的一条记录,我的本意是根据files的大小生成一个包含n个map的List<Map<String,Object>,list中map的其他key的值都不变,只有key为file的值须要替换为files数组内的内容,于是大致写了上述的处理代码,咋一看上去没有任何问题。运行之后发现,list中的每一个map中key为file的value都为“asdf” !这是什么问题呢,换了多种方法处理,例如,先生成list,再遍历list进行修改,可是结果没有任何变化,超出预期!
[{id=15, file=asdf, name=works}, {id=15, file=asdf, name=works}, {id=15, file=asdf, name=works}]
折腾好久,终于发现问题:其实list中的所有元素(map)的引用都是指向内存中的同一块区域,所以上述的修改方式,最终会变成上述输出。
处理办法:
public static void main(String[] args) {
String[] files=new String[]{"abcd","qwer","asdf"};
Map<String,Object> map=new HashMap<String,Object>();
map.put("file", "12345");
map.put("id", 15);
map.put("name", "works");
List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
for (int i = 0; i < files.length; i++) {
Map<String,Object> hmp=new HashMap<String,Object>();
Iterator<String> it=map.keySet().iterator();
while (it.hasNext()) {
String key = (String) it.next();
hmp.put(key, map.get(key));
}
list.add(hmp);
list.get(i).put("file", files[i]);
}
System.out.println(list.toString());
}
这样做的目的是每次都new一个Map对象hmp,然后把原来map中的内容复制到新的Map对象中,那么list中的map对象便是分别拥有不同的存储区域。然后对key对应的value进行修改时便不会出现之前被覆盖的问题了。
[{id=15, file=abcd, name=works}, {id=15, file=qwer, name=works}, {id=15, file=asdf, name=works}]
出现这个问题,主要是对内存/对象的引用以及Map的相关API理解不深导致
修改Map中确定key对应的value问题的更多相关文章
- Map java中的map 如何修改Map中的对应元素
Map java中的map 如何修改Map中的对应元素 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象. Map的接口 Map ...
- 在map中一个key中存多个值
一说到map都想到key-value键值队存在.key可以为最多一个null的key. 今天开发中一个业务需求,在map中一个key中存多个对象. 我首先想到Map<String,List> ...
- golang中的slice翻转存在以及map中的key判断
//slice翻转 func stringReverse(src []string){ if src == nil { panic(fmt.Errorf("the src can't be ...
- 如何判断Map中的key或value是什么类型
在上班写工具类时,遇到了一个问题,将xml文件的节点都放入map容器中时,map的value也是一个map,导致取map的value时,需要判断这个value的数据类型,用到了一下说的这些知识: 对于 ...
- 如何判断Map中的key或value类型
在上班写工具类时,遇到了一个问题,将xml文件的节点都放入map容器中时,map的value也是一个map,导致取map的value时,需要判断这个value的数据类型,用到了一下说的这些知识: 对于 ...
- 随机获取一个集合(List, Set)中的元素,随机获取一个Map中的key或value
利用Java提供的Random类.从List或Set中随机取出一个元素,从Map中随机获取一个key或value. 因为Set没有提供get(int index)方法,仅仅能先获取一个随机数后.利用一 ...
- 修改map中原来的各种Key
简单描述: 做数据迁移的时候,需要展示数据库的字段信息,但是我发现 Oracle的sql查询到的结果 出来默认是大写的 和 前端vue的参数小写开头+驼峰 不太一样 所以后台取到的数据都是是引用Lis ...
- MyBatis动态SQL使用,传入参数Map中的Key判断
<select id="" parameterType="Map" resultMap="commodityResultMap" &g ...
- 【Java必修课】通过Value获取Map中的键值Key的四种方法
1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...
随机推荐
- ubuntu set host name
http://wiki.joyent.com/wiki/display/jpc2/Setting+the+Host+Name+on+a+Linux+VM Set the host name in th ...
- STL容器的效率比较
1.介绍 顺序存储容器 : string.vector.list.deque 关联存储容器:map底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错, 只是每次插入 ...
- 【POJ】2170 Lattice Animals
1. 题目描述给定$n \times m, n.m \in [1, 10]$的方格,求不同形状的$[1 \cdots 10]$联通块的个数?所谓不同形状,表示不能通过平移.旋转.镜像实现相同的形状.2 ...
- jenkins mac slave 设置
1.在jenkins上增加节点, 2,在mac系统中将ssh的服务打开在偏好设置- 互联网与无线 - 共享中 3,使用mac root用户修改sshd-config的鉴权方式 首先获取到root用户登 ...
- crontab无法调用java的问题解决
本来想将写的代码挂在crontab下运行,谁知道无法运行,没有任何输出,试着用ls -al >> 1.log试了一下,确定crontab是正常运行的. 从网站上找了下问题,原因出在cron ...
- bzoj2535 2109
做过4010这题其实就水了 把图反向之后直接拓扑排序做即可,我们可以用链表来优化 每个航班的最小起飞序号就相当于在反向图中不用这个点最迟到哪 type node=record po,next:long ...
- bzoj1064
很巧妙的题 首先有几种情况 1. 有环 2.两点间有多条路径 3.其他 3.显然最简单,最小是3,最大是每个弱联通块中最长链 2.显然,两点间两条路径的差是答案的倍数 1.出现环,那答案一定是其约数, ...
- C#计算程序执行速度
long t1 = DateTime.Now.Ticks; //执行程序,例如处理100个文件 long t2 = DateTime.Now.Ticks; Response.Write("执 ...
- JQuery Ajax 在asp.net中使用小结
自从有了JQuery,Ajax的使用变的越来越方便了,但是使用中还是会或多或少的出现一些让人短时间内痛苦的问题.本文暂时总结一些在使用JQuery Ajax中应该注意的问题,如有不恰当或者不完善的地方 ...
- vs2010 js代码折叠
方法一:插件 在Visaul Studio 2010中写js或css代码,缺少像写C#代码时的那种折叠功能,当代码比较多时,就很不方便. 但是已经有VS2010扩展支持这个功能,它就是--JSEn ...