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的值。

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