使用HashMap时碰到的串值问题

本文通过一个具体的示例探讨了在Java中使用List存储HashMap对象时可能遇到的值传递问题。当多个List共享相同的HashMap实例时,修改其中一个实例会影响到所有引用该实例的地方。文章最后提供了避免此类问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

相关文章:

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对象来消除该影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值