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