這其實是Java中變量和對象作用域的問題。
首先說說String吧,
- String s = "s" ;
- session .setAttribute("s" ,s);
String s = "s";
session
.setAttribute("s",s);
session
裏存的是指向"s"這個對象的引用,而後
- s = "ss" ;
s = "ss";
則是把s引用指向另一個對象"ss",所以輸出s。對於基本類型的包裝器類型,也是同理。
至於Map,
- Map<String,String> s = new HashMap<String,String>();
- 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
中
的引用所反映。
你可以做如下試驗,
- 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" ));
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
中
後,
- int i = 1 ;
- session .setAttribute("i" ,i);
int i = 1;
session
.setAttribute("i",i);
無論這個i怎麼 變,都不會改變session 中i的值。