session的存储和内存的引用

今天做练习的时候遇到这样一个问题
[quote]
Map<String,String> s = new HashMap<String,String>();
session.setAttribute("s",user);
s.put("1","1");
s.put("2","2");
s.put("3","3");
Map<String,String> s1 = (Map<String,String>)session.getAttribute("s");
out.put(s1.size());
[/quote]
大家觉得这样输出 0 吗?,我刚开始以为是输出0,因为我没有在把赋值后的Map存到session,可是他却输出3,还以为是程序哪里出错了,我又用String去做同样的测试
[quote]
String s = "s";
session.setAttribute("s",s);
s = "ss";
String s1 = (String)session.getAttribute("s");
out.put(s1);
[/quote]
这次我觉得按照前面Map一样这次输出ss,可是他却输出了s。
我就想到了会不会是跟值传递和引用传递同一个道理,又用了int做实验,结果和我想的一样。
可是String是对象又不是基本数据类型,为什么会这样,原来String是很特殊的,
String s = "s";
s = "ss";
这样就有两个对象,于是我定下结论,session存储是存一个对象的内存地址的引用。
但是为了保险起见,我又做了一个例子,就是把int换成Integer,结果却出乎意料,它居然和int没有区别,可是我记得一个Integer是对象,而int是基本数据类型,在内存中的处理是不一样的,我做了很多此测试,没想到所有的基本数据类型的包装类都是一样
[quote]
int i = 1;
session.setAttribute("i",i);
i = 2;
int i1= ((Integer)(session.getAttribute("i")).intValue();
out.put(i1);

结果输出:1,这里的i和i1的hashCode是不一样的
[/quote]
[quote]
Integer i = new Integer(1);
session.setAttribute("i",i);
i = 2;
Integer i1= (Integer)session.getAttribute("i");
out.put(i1);

结果输出:1,这里的i和i1的hashCode是不一样的
[/quote]

做了很多实验,发现就是除了基本数据类型的包装类和String,其他对象都是象Map一样,前后都是引用同一个内存地址,为什么有的对象是引用内存地址有的对象却不是,还是我的想法错了。我的想法是session存储是存一个对象的内存地址的引用,大家发表一下自己意见
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值