修改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 ...
随机推荐
- SQLiteParameter不能将TableName作为参数
http://stackoverflow.com/questions/1274432/sqlite-parameters-not-allowing-tablename-as-parameter Gen ...
- Xmanager Enterprise Linking VM Redhat Linux AS4.7 X64–Server Configuration
[root@localhost ~]# vi /etc/inittab ## inittab This file describes how the INIT process shou ...
- 1493: [NOI2007]项链工厂
线段树. 真还就是个线段树.. 除去操作1,2的话,线段树很容易就处理了,问题在于如何处理操作1和2.(这点没想到).. 我们用一个delta维护操作1,如果没有旋转就+k,不然就-k. 每次读入i和 ...
- UVa 11992 (线段树 区间修改) Fast Matrix Operations
比较综合的一道题目. 二维的线段树,支持区间的add和set操作,然后询问子矩阵的sum,min,max 写完这道题也是醉醉哒,代码仓库里还有一份代码就是在query的过程中也pushdown向下传递 ...
- android开发中eclipse里xml开发的自动提示和使用帮助快捷键提示
Eclipse Android 代码自动提示功能 Eclipse for android 设置代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > ...
- ffmpeg windows 雪花声解决方法
替换所有文件里的<math.h>为<mathimf.h>即可. 我用ffmpeg-0.6.3版测试时,好像mathimf.h文件和其他文件有冲突,需要修改源码. 和qdm2.c ...
- 【JSP】JSP动态显示时间
function showtime() { var today; var hour; var second; var minute; var year; var month; var date; va ...
- GCC 编译优化指南
转自: http://www.jinbuguo.com/linux/optimize_guide.html GCC 编译优化指南 作者:金步国[www.jinbuguo.com] 版权声明 本文作者是 ...
- [Everyday Mathematics]20150129
计算下列积分 $$\bex \int_a^b (x-a)^2(b-x)^3\rd x. \eex$$
- XA事务处理
XA接口详解 X/Open XA接口是双向的系统接口,在事务管理器(Transaction Manager)以及一个或多个资源管理器(Resource Manager)之间形成通信桥梁.事务管理器控制 ...