session的存儲和內存的引用

這其實是Java中變量和對象作用域的問題。
首先說說String吧,

Java代碼
  1. String s =  "s" ;   
  2. session .setAttribute("s" ,s);   
String s = "s"; 
session

.setAttribute("s",s); 


session 裏存的是指向"s"這個對象的引用,而後

Java代碼
  1. s =  "ss" ;   
s = "ss"; 


則是把s引用指向另一個對象"ss",所以輸出s。對於基本類型的包裝器類型,也是同理。


至於Map,

Java代碼
  1. Map<String,String> s =  new  HashMap<String,String>();   
  2. session .setAttribute("s" ,user);   
Map<String,String> s = new HashMap<String,String>(); 
session

.setAttribute("s",user); 


把一個指向map的引用存進了session ,之後對這個HashMap對象所作的 變化,還是會反映給這個指向他的引用。
其他對象的道理,和Map一樣。

可能你要問了,String和Integer同樣也是對象,爲什麼和Map這樣的對象有不同的效果呢。其實,細看你就會發現,你對String和 Integer的操作並不是在同一個對象上進行的,而是賦予了另一個不同的對象,也正因爲String和Integer對象的不可變性,導致了要改變這兩 個對象的值,只有新建一個對象。換句話說,只要是在同一個對象上操作,該對象的變化肯定能被session 中 的引用所反映。

你可以做如下試驗,

Java 代碼
  1.  Map map= new  HashMap();  
  2. Map inside=new  HashMap();  
  3. inside.put("1" "a" );  
  4. inside.put("2" "b" );  
  5.   
  6. map.put("a" , inside);  
  7.   
  8. inside=new  HashMap();  
  9. System.out.println(map.get("a" ));  
   Map map=new HashMap();
		Map inside=new HashMap();
		inside.put("1", "a");
		inside.put("2", "b");
		
		map.put("a", inside);
		
		inside=new HashMap();
		System.out.println(map.get("a"));


是不是和上面是一樣的結果?

上面的這些賦值都是賦的引用,而Java的基本數據類型賦的是值,所以當int被賦到session 中 後,

Java代碼
  1. int  i =  1 ;   
  2. session .setAttribute("i" ,i);   
int i = 1; 
session

.setAttribute("i",i); 

無論這個i怎麼 變,都不會改變session 中i的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章