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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值