`
2277259257
  • 浏览: 498371 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

容器类仅能持有对象引用(指向对象的指针) 而不是将对象信息copy一份至数列某位置

    博客分类:
  • java
 
阅读更多

 

最近在做一个项目里,给ArrayList 赋值发现结果不正常。仔细想了一下然来是没有深入理解 “容器类仅能持有对象引用(指向对象的指针)”  这句话。
下面来看一下示例程序:

  1. import java.util.ArrayList;  
  2. import java.util.HashMap;  
  3. import java.util.Map;  
  4. public class MapList {  
  5.     public static void main(String []args){  
  6.         ArrayList <Map<String,String>> mapList=new ArrayList <Map<String,String> >();  
  7.         Map<String ,String> map=new HashMap<String,String>();  
  8.         for(int i=0;i<5;i++){  
  9.             map.put("key","value"+i);  
  10.             mapList.add(map);  
  11.         }  
  12.         System.out.println("mapList.size:"+mapList.size());  
  13.         System.out.println("mapList:"+mapList);  
  14.         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>");  
  15.         ArrayList <Map<String,String>> mapList1=new ArrayList <Map<String,String> >();  
  16.         for(int i=0;i<5;i++){  
  17.             Map<String ,String> map1=new HashMap<String,String>();  
  18.             map1.put("key","value"+i);  
  19.             mapList1.add(map1);  
  20.         }  
  21.         System.out.println("mapList1:"+mapList1);  
  22.     }  
  23. }  
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MapList {
	public static void main(String []args){
		ArrayList <Map<String,String>> mapList=new ArrayList <Map<String,String> >();
		Map<String ,String> map=new HashMap<String,String>();
		for(int i=0;i<5;i++){
			map.put("key","value"+i);
			mapList.add(map);
		}
		System.out.println("mapList.size:"+mapList.size());
		System.out.println("mapList:"+mapList);
		System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>");
		ArrayList <Map<String,String>> mapList1=new ArrayList <Map<String,String> >();
		for(int i=0;i<5;i++){
			Map<String ,String> map1=new HashMap<String,String>();
			map1.put("key","value"+i);
			mapList1.add(map1);
		}
		System.out.println("mapList1:"+mapList1);
	}
}

打印结果为:
mapList.size:5mapList:[{key=value4}, {key=value4}, {key=value4}, {key=value4}, {key=value4}]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mapList1:[{key=value0}, {key=value1}, {key=value2}, {key=value3}, {key=value4}]
为什么第一条打印的是:[{key=value4}, {key=value4}, {key=value4}, {key=value4}, {key=value4}]。
因为map 只new 了一次,且在循环外。并且collection 是持有对象的引用。
  1. Map<String ,String> map=new HashMap<String,String>();  
  2.         for(int i=0;i<5;i++){  
  3.             map.put("key","value"+i);  
  4.             mapList.add(map);  
  5.         }  
Map<String ,String> map=new HashMap<String,String>();
		for(int i=0;i<5;i++){
			map.put("key","value"+i);
			mapList.add(map);
		}
所以打印出来肯定是一样的都是:[{key=value4}, {key=value4}, {key=value4}, {key=value4}, {key=value4}]。
效果如图所示:


而mapList 打印出来结果为:mapList1:[{key=value0}, {key=value1}, {key=value2}, {key=value3}, {key=value4}]。
如下图所示:



在我另一篇转载博客了讲了( link 为: http://blog.csdn.net/clam_clam/article/details/6645021 ) 
1、容器类和Array的区别、择取
      *     容器类仅能持有对象引用(指向对象的指针),而不是将对象信息copy一份至数列某位置。
      *     一旦将对象置入容器内,便损失了该对象的型别信息

但今天一开始还出错所以看书固然重要 ,实践更重要呀。

没看书的话不可能一出错就意识到问题所在,也要经过实践才能强化知识。

  1. System.out.println("mapList1:"+mapList1);  
  2.     System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>");  
  3.     ArrayList <Integer> list3=new ArrayList <Integer> ();  
  4.     Integer intvar=new Integer(0);  
  5.     for(int i=0;i<5;i++){  
  6.         intvar=i;  
  7.         list3.add(intvar);  
  8.     }  
  9.     System.out.println(list3);  
  10.     System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>");  
  11.     ArrayList <User> list4=new ArrayList <User> ();  
  12.     User user=new User();  
  13.     for(int i=0;i<5;i++){  
  14.         user.setName("name"+i);  
  15.         list4.add(user);  
  16.     }  
  17.     System.out.println(list4);  
	System.out.println("mapList1:"+mapList1);
		System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>");
		ArrayList <Integer> list3=new ArrayList <Integer> ();
		Integer intvar=new Integer(0);
		for(int i=0;i<5;i++){
			intvar=i;
			list3.add(intvar);
		}
		System.out.println(list3);
		System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>");
		ArrayList <User> list4=new ArrayList <User> ();
		User user=new User();
		for(int i=0;i<5;i++){
			user.setName("name"+i);
			list4.add(user);
		}
		System.out.println(list4);

结果为:
[0, 1, 2, 3, 4]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
[User [name=name4], User [name=name4], User [name=name4], User [name=name4], User [name=name4]]。
为什么事 [0,1,2,3,4]因为:intvar=i; 会自动装箱,new 一个空间。

而User [name=name4], User [name=name4], User [name=name4], 不会。没有在for 循环里重新开辟空间所以都指向同一个空间。
2. 对象类型数组也是持有引用
看下面例子:

  1. class Obj{  
  2.     String name;  
  3.     Obj(String name){  
  4.         this.name=name;  
  5.     }  
  6.     void setName(String name){  
  7.         this.name=name;  
  8.     }  
  9.     @Override  
  10.     public String toString() {  
  11.         return "Obj["+this.name+"]";  
  12.         //return super.toString();   
  13.           
  14.     }  
  15. }  
  16. public class FS {   
  17.     public static void main(String[] args){    
  18.            Obj[] arr=new Obj[5];  
  19.            Obj obj=new Obj("computer");  
  20.            for(int i=0;i<5;i++){  
  21.               arr[i]=obj;  
  22.            }  
  23.            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");  
  24.            for(int i=0;i<5;i++){  
  25.                  System.out.print(arr[i]);  
  26.            }  
  27.            System.out.println("");  
  28.            obj.setName("info");  
  29.            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");  
  30.            for(int i=0;i<5;i++){  
  31.                  System.out.print(arr[i]);  
  32.            }  
  33.            System.out.println("");         
  34.     }    
  35. }  
class Obj{
	String name;
	Obj(String name){
		this.name=name;
	}
	void setName(String name){
		this.name=name;
	}
	@Override
	public String toString() {
		return "Obj["+this.name+"]";
		//return super.toString();
		
	}
}
public class FS { 
    public static void main(String[] args){  
           Obj[] arr=new Obj[5];
           Obj obj=new Obj("computer");
           for(int i=0;i<5;i++){
           	  arr[i]=obj;
           }
           System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
           for(int i=0;i<5;i++){
            	 System.out.print(arr[i]);
           }
           System.out.println("");
           obj.setName("info");
           System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
           for(int i=0;i<5;i++){
            	 System.out.print(arr[i]);
           }
           System.out.println("");       
    }  
}
运行结果为:
  1. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  2. Obj[computer]Obj[computer]Obj[computer]Obj[computer]Obj[computer]  
  3. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  
  4. Obj[info]Obj[info]Obj[info]Obj[info]Obj[info]  
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Obj[computer]Obj[computer]Obj[computer]Obj[computer]Obj[computer]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Obj[info]Obj[info]Obj[info]Obj[info]Obj[info]
改变obj 后arr 数组都改变了,所以数组拥有的是obj 对象的引用。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics