Map使用注意事项

Map使用注意事项

在编码过程中,对Map使用所遇到的一些问题,记录下来。
注意:num=3

时间:2020年10月28日(持续更新ing)

Map存放着类对象的引用地址

在for循环外只新建一个Map

    public static void mapTestOne(int num){
        List<Map> demoList = new ArrayList<Map>();
        //for循环外新建Map
        Map<String, Object> demoMap = new HashMap<String, Object>();
        for (int i=0; i<num; i++){
            demoMap.put("a",i);
            demoMap.put("b",i);
            demoList.add(demoMap);
        }
        System.out.println(demoList);
    }

随着for循环新建多个Map

    public static void mapTestTwo(int num){
        List<Map> demoList = new ArrayList<Map>();
        for (int i=0; i<num; i++){
            //随着for循环新建多个Map
            Map<String, Object> demoMap = new HashMap<String, Object>();
            demoMap.put("a",i);
            demoMap.put("b",i);
            demoList.add(demoMap);
        }
        System.out.println(demoList);
    }

与方法二相比,对Map进行了清理(map.clear())

    public static void mapTestThree(int num){
        List<Map> demoList = new ArrayList<Map>();
        for (int i=0; i<num; i++){
            Map<String, Object> demoMap = new HashMap<String, Object>();
            demoMap.put("a",i);
            demoMap.put("b",i);
            demoList.add(demoMap);
            //与mapTestTwo相比,对Map进行了清理
            demoMap.clear();
        }
        System.out.println(demoList);
    }

测试结果:

----------for循环外只新建一个Map-------------
[{a=2, b=2}, {a=2, b=2}, {a=2, b=2}]
----------随着for循环新建多个Map-------------
[{a=0, b=0}, {a=1, b=1}, {a=2, b=2}]
----------与方法二相比,对Map进行了clear-------------
[{}, {}, {}]

解析:

  1. 第一种方法在for循环外面实例化,虽然每次循环都将map的值添加到list中,但是添加的是同一个Map对象的地址,所以第一种方法的结果中三个Map都是同样的值。
  2. 正确的做法应该像第二种方法一样,在for循环中实例化Map,循环一次就实例化一个Map对象,这样list保存的就是不同的Map对象的地址,才能得到正确的结果。(其他引用数据类型同理)
  3. 第三种方法中可以发现,随着map里面的值清零,list中所保存的Map也相应的清零了。Map中存储的是对象的引用,它的值会随着对象值的改变而改变,最好是将对象处理完毕,再放到Map中进行存储。

结论

  1. Map和List存放的是类对象的引用地址,demoList.add(demoMap)保存的是demoMap这个实例化对象的地址,它的值会随着对象值的改变而改变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值