这其实是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的值。