java自动拆箱装箱

Luger 2012-11-11 09:22:36
int n=420;
Integer i = new Integer(n);
List<Integer> l=new ArrayList<Integer>();
l.add(i);
l.add(i);
System.out.println(l.get(0)==l.get(1));

这个输出true
为什么
int n=420;
List<Integer> l=new ArrayList<Integer>();
l.add(n);
l.add(n);
System.out.println(l.get(0)==l.get(1));

输出false
把n换成42又是true
我看网上说和自动拆箱 装箱有光 但是不明白为什么的
谢谢各位
...全文
188 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Luger 2012-11-11
  • 打赏
  • 举报
回复
引用 3 楼 king769147 的回复:
LZ,我知道你想问什么了,但是你把你自己搞混了··· 第一段: int n=420; Integer i = new Integer(n); List<Integer> l=new ArrayList<Integer>(); l.add(i); l.add(i); // 这里你只 new 一个对……
你说的对 上面两个 没运行就说出来了 其实问题就是“Java认为 -128~ 127 (byte)的范围是 最常用的,所以 自动装箱的时候(int -> Integer) 的时候会将该范围的整数缓存起来,当再次使用的时候不会生成新的值而是用原来的。”这句话
享十三 2012-11-11
  • 打赏
  • 举报
回复
“==”是比较两个对象是不是引用自同一个对象 “equals()”是比较两个对象的内容
wonkju 2012-11-11
  • 打赏
  • 举报
回复
不好意思,我打错了一个字: 第一段 -> 第二段···我写错了下面的 “一”
wonkju 2012-11-11
  • 打赏
  • 举报
回复
LZ,我知道你想问什么了,但是你把你自己搞混了··· 第一段: int n=420; Integer i = new Integer(n); List<Integer> l=new ArrayList<Integer>(); l.add(i); l.add(i); // 这里你只 new 一个对象 i ,当然add 是同一个对象。 System.out.println(l.get(0)==l.get(1)); // 如果你改成下面的代码,outPut 就是 false: int n = 420; Integer i = new Integer(n); Integer j = new Integer(n); List<Integer> l = new ArrayList<Integer>(); l.add(i); l.add(j); System.out.println(l.get(0) == l.get(1)); 第一段: int n=420; List<Integer> l=new ArrayList<Integer>(); l.add(n); l.add(n); System.out.println(l.get(0)==l.get(1)); // ouPut 确实是 false 原因: 这个和常量池有关,你可以看看源代码“Integer 的valueOf 方法, Java认为 -128~ 127 (byte)的范围是 最常用的,所以 自动装箱的时候(int -> Integer) 的时候会将该范围的整数缓存起来,当再次使用的时候不会生成新的值而是用原来的。 我觉得应该说的很清晰了吧···
oyhj_nicholas 2012-11-11
  • 打赏
  • 举报
回复
第二个:自动生成两个Integer对象来封装n,两个对象肯定是两个不同hashCode,所以输出false
w00925036 2012-11-11
  • 打赏
  • 举报
回复
这个首先楼主弄明白==的运行机制,他比较的是比较信息是否相等,如果比较者是两个常量,则自然相等,因为第二种输出false的情况是对n这个创建了两个对象,也就是产生两个不同的地址存到容器里,如果我不猜错的话,楼主可以先把int改成string,然后用equals方法比较,那么就都输出true了。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧