有关ArrayList增加Map引发的一个BUG
2014-02-28 15:05
260 查看
今天碰到一个很奇怪的问题。用一个ArrayList来增加map.具体是这样的:
for(int i=0;i<arr.length();++i){ temp = (JSONObject) arr.get(i); mapTemp.clear(); mapTemp.put("materialName", temp.getString("materialName")); mapTemp.put("materialFormat", temp.getString("unitName")); mapTemp.put("id", temp.getString("id")); listItem.add(mapTemp); Log.i("mapGet=========", listItem.get(i).get("materialName")); }
本来是为了效率考虑,不用每次都重新创建MAp.就使用他的clear方法。结果发现竟然List中存放的MAP数据都是相同的。当时觉得很不可理解。
后来经过跟踪发现了问题,List每次把map的引用存进去,当调用map的clear()方法后,map里面数据会被清空,最后map的数据就是最后放进去的。而List里放的都是这个map的引用。因此也就不难理解为什么会出现存放的数据是最后一次放进去的情况了。
解决的方法就是每次都要创建。。。。
HashMap<String, String> mapTemp = null; for(int i=0;i<arr.length();++i){ temp = (JSONObject) arr.get(i); mapTemp = new HashMap<String, String>(); mapTemp.put("materialName", temp.getString("materialName")); mapTemp.put("materialFormat", temp.getString("unitName")); mapTemp.put("id", temp.getString("id")); listItem.add(mapTemp); Log.i("mapGet=========", listItem.get(i).get("materialName")); }
相关文章推荐
- java中对于Map引发的一个bug
- 一个bug引发的思考 --- ASP.NET页面加载顺序讨论
- 一个bug引发的思考 --- ASP.NET页面加载顺序讨论
- 一个bug引发的哲学思考
- 建议64:为循环增加Tester-Doer模式而不是将try-catch置于循环内 如果需要在循环中引发异常,你需要特别注意,应为抛出异常是一个相当影响性能的过程。应该尽量在循环当中对异常发生的一
- IOS学习笔记(12)——一个模态视图切换bug引发的思考
- 一个Php的Xml库的Bug引发的血案
- 一个有关fstream类的bug
- 一个Tahoma字体bug引发的思考—关于样式bug的分析流程
- Win2012R2的一个Bug---安装群集后可能引发的软件崩溃问题及相应补丁
- MySQL的注释、Query_cache有关的一个bug
- 在向一个ArrayList中添加大量元素前,可以使用ensureCapacity方法来增加ArrayList的容量
- DynamicDataExchange(DDE)机制引发的卡死有一个bug
- [转载]经典搞笑:一个BUG引发的血案|为程序员打造的年终大片
- 转发同事总结:一个BUG引发的血案(总结篇)
- 一个BUG引发的思考
- 与端口冲突有关的一个低概率bug的定位过程(这次不是360的错啊)---浅谈bind()函数返回失败
- 表单提交后分页页面标签POST实现 —— 一个小小的bug引发的思考
- 一个有关canvas的Bug
- 一个由CountDownLatch引发的Bug