List<Map<String, Object>>保存的是引用数据类型的地址

今天敲代码的时候遇到一个有意思的问题,直接上代码:

 
  
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!
 
  

 
  

 
  

 
  
 
  
 
 


猜你喜欢

转载自blog.csdn.net/u011207553/article/details/53888391