修改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 ...
随机推荐
- EXC_BAD_ACCESS
EXC_BAD_ACCESS,就可以在控制台中看到是哪个对象被释放掉了. 另外要避免频繁的出现上述问题,下面是一些建议: 1. 当引用了别人传递进来的对象时,最好retain一下,避免在别人那里已经把 ...
- Android开发之三种动画
转载:http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html http://www.lightskystreet.com/2 ...
- java_十进制数转换为二进制,八进制,十六进制数的算法
java_十进制数转换为二进制,八进制,十六进制数的算法 java Ê®½øÖÆÊýת»»Îª¶þ½øÖÆ,°Ë½øÖÆ,Ê®Áù½øÖÆÊýµÄË㕨 using System; using S ...
- 纯tarjan poj2186
tarjan,叙叙旧咯 #include<cstdio>#define maxn 50005int e[maxn],ne[maxn],be[maxn],all;int DFN[maxn], ...
- tomcat部署两个相同的项目报错不能访问
需要在同一个tomcat上搭建一个项目的两个版本,都要能跑起来 直接复制两个项目部署,会出现两个错误: 1,webAppKey 冲突 2,tomcat启动会有内存溢出(OutOfMemoryErr ...
- FFMPEG视音频编解码零基础学习方法
在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“ ...
- linux lnmp编译安装
关闭SELINUX vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉 SELINUX=disabled ...
- solr4.5 schema.xml配置文件
schema.xml配置文件是用于定义index索引库的结构,有点类似于数据表表的定义. 当我们打开schema.xml配置文件时,也许会被里面密密麻麻的代码所吓倒,其实不必惊慌,里面其实就两个东西f ...
- AFNetWorking 的简单使用
转:http://blog.csdn.net/marujunyy/article/details/18424711 由于ASIHTTPRequest 不再更新了,不能使用block感觉不太好用:最后选 ...
- 关于UT的一些总结
本文是个人对于UT的一些想法和总结,参考时建议请查阅官方资料. 转载请注明出处:http://www.cnblogs.com/sizzle/p/4476392.html 测试思想 编写UT测试代码,通 ...