日期:2014-05-20  浏览次数:20691 次

java自动拆箱装箱
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
我看网上说和自动拆箱 装箱有光 但是不明白为什么的 
谢谢各位
------最佳解决方案--------------------
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)
的时候会将该范围的整数缓存起来,当再次使用的时候不会生成新的值而是用原来的。
我觉得应该说的很清晰了吧···

------其他解决方案--------------------
这个首先楼主弄明白==的运行机制,他比较的是比较信息是否相等,如果比较者是两个常量,则自然相等,因为第二种输出false的情况是对n这个创建了两个对象,也就是产生两个不同的地址存到容器里,如果我不猜错的话,楼主可以先把int改成string,然后用equals方法比较,那么就都输出true了。
------其他解决方案--------------------
第二个:自动生成两个Integer对象来封装n,两个对象肯定是两个不同hashCode,所以输出false
------其他解决方案--------------------
不好意思,我打错了一个字:
第一段 -> 第二段···我写错了下面的 “一”
------其他解决方案--------------------
“==”是比较两个对象是不是引用自同一个对象 
“equals()”是比较两个对象的内容 
------其他解决方案--------------------
引用:
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)