今天敲代码的时候遇到一个有意思的问题,直接上代码:
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); Map<String, Object> map = new HashMap<String, Object>(); for(int i=0;i<5;i++) { map.put("a", i); map.put("b", i); list.add(map); } System.out.println(list);
输出结果是:[{b=4, a=4}, {b=4, a=4}, {b=4, a=4}, {b=4, a=4}, {b=4, a=4}];
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); Map<String, Object> map = null; for(int i=0;i<5;i++) { map = new HashMap<String, Object>(); map.put("a", i); map.put("b", i); list.add(map); } System.out.println(list);
输出结果是:[{b=0, a=0}, {b=1, a=1}, {b=2, a=2}, {b=3, a=3}, {b=4, a=4}];这才是我想要的,有经验的朋友可能已经知道我要说什么了,下面做出简单解释。
List和Map都是引用数据类型,list.add(map)保存的是map这个实例化对象的地址,前面那种写法在for循环外面实例化,虽然每循环一次map的值都在改变后添加到list 当中,但是都是添加的同一个map对象的地址,所以在循环了四次后,list中四个map都是同样的值;正确的写法应该是在for循环中实例化map,这样循环一次就实例化一 个map对象,这样list保存的就是不同的map对象的地址,才能得到正确的结果;其他引用数据类型也是同样的道理,跟我一样缺乏经验的同学要注意咯,哈哈!
其实这个概念在刚学java的时候就知道了,但是在实际写代码的过程中居然没有注意,还是经验不足啊,纸上得来终觉浅,绝知此事要躬行,编程还是得多练,这样才能
消化理论知识啊。
fighting!