使用HashMap时碰到的串值问题

来源:互联网 发布:网站建设软件 免费 编辑:程序博客网 时间:2024/05/19 20:21

转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/51649404

相关文章:

  • 《Java集合类之Map》
  • 《 Java集合类之List性能比较》

1、背景

碰到一个场景是利用List存储HashMap对象,然后分别更新每个对象的指定Key对应的value。利用到了两组List,都存有内容相仿的HashMap对象。

2、说明

创建了2个List,分别往其中添加对象。做了100次循环,循环处理条件是i大于10,其中一个list里面的一个对象值加1,正常情况应该是一个最终的值为11,一个为89.

public class Test01 {    public static void main(String[] args){        List<HashMap<String,Object>> list_pass = new ArrayList<HashMap<String,Object>>();        List<HashMap<String,Object>> list_reject = new ArrayList<HashMap<String,Object>>();        for(int i=0;i<9;i++){            HashMap<String,Object> map = new HashMap<String,Object>();            map.put("choice_id", 1);            map.put("score_id", 1);            map.put("score_name", "测试");            map.put("number", 0);               list_pass.add(map);            list_reject.add(map);        }        System.out.println("list_pass:"+list_pass.size()+",list_reject:"+list_reject.size());        for(int j=0;j<100;j++){            if(j > 10){                for(int k=0;k<list_reject.size();k++){                    HashMap<String,Object> map_reject = list_reject.get(k);                         int map_score_id = Integer.parseInt(String.valueOf(map_reject.get("score_id")));                    if(map_score_id == 1){                        int map_count_pass = Integer.parseInt(String.valueOf(map_reject.get("number")));                        map_count_pass = map_count_pass + 1;                        map_reject.put("number", map_count_pass);                           System.out.println("map_reject:"+map_count_pass);                        break;                    }                }            }else{                for(int k=0;k<list_pass.size();k++){                    HashMap<String,Object> map_pass = list_pass.get(k);                         int map_score_id = Integer.parseInt(String.valueOf(map_pass.get("score_id")));                    if(map_score_id == 1){                        int map_count_pass = Integer.parseInt(String.valueOf(map_pass.get("number")));                        map_count_pass = map_count_pass + 1;                        map_pass.put("number", map_count_pass);                             System.out.println("map_pass:"+map_count_pass);                        break;                    }                }            }                               }        System.out.println("list_pass:"+list_pass.toString()+",list_reject:"+list_reject.toString());    }}

看看运行结果:

list_pass:[{score_name=测试, score_id=1, number=100, choice_id=1}],list_reject:[{score_name=测试, score_id=1, number=100, choice_id=1}]

结果与想的不一致,肯定是处理环节出问题了,细看,问题应该就出在初始化List问题上,下面为初始化代码,HashMap只new了一次,同时被两个地方引用,因此出现了串值。

for(int i=0;i<9;i++){            HashMap<String,Object> map = new HashMap<String,Object>();            map.put("choice_id", 1);            map.put("score_id", 1);            map.put("score_name", "测试");            map.put("number", 0);               list_pass.add(map);            list_reject.add(map);        }

试试用两个HashMap对象。

运行结果正确:

list_pass:[{score_name=测试, score_id=1, number=11, choice_id=1}],list_reject:[{score_name=测试, score_id=1, number=89, choice_id=1},]

3、小结

在往不同对象中封装HashMap时,一定要考虑是否会发生串值影响,可以通过重新new HashMap对象来消除该影响。

0 0