修改Map中确定key对应的value问题
来源:互联网 发布:单机手游 知乎 编辑:程序博客网 时间:2024/04/30 09:04
今天在码代码的时候出现一个没有预料的问题:
先看下面的代码:
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理解不深导致
0 0
- 修改Map中确定key对应的value问题
- java Map的问题取得最大value对应的key
- 根据value取得map中对应的key(笔记)
- 根据value取得map中对应的key
- 返回map中最大值value及其对应的key
- Map中根据value排序---输出value最大时所对应的Key
- c++容器map中根据key求得对应value值
- map中key值相等 对应value值加1
- Struts2在页面中,取得Map的某一个key对应value值
- JSP中用EL表达式取Map中某一个key对应的value
- 从map中取出最大或最小value值对应的key值
- 利用map查找对应于key值的mapped value
- 多个KEY值对应一个VALUE的MAP
- map key value的排序问题
- 定义Iterator遍历器取出set中的key,然后通过key的值在map中取出对应value值
- STL中map的key和value
- 合并map中key相同的value
- map--已知key取对应value
- android开发报 intent no such file or directory
- Javascript 学习备忘(一)
- 海量数据处理问题
- LVS集群
- django auto_now与auto_now_add的区别
- 修改Map中确定key对应的value问题
- [QT]第一个QT程序
- 杭电acm--2099
- 内核模块管理学习(1)
- memcached真实项目中的应用
- 新手安装ecshop集合版出现cls_image::gd_version()和不支持JPEG
- linux压缩和解压
- 用PopupWindow实现下拉列表
- 年终巨献 史上最全 ——LINQ to SQL语句