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
我看网上说和自动拆箱 装箱有光 但是不明白为什么的 
谢谢各位

解决方案 »

  1.   

    这个首先楼主弄明白==的运行机制,他比较的是比较信息是否相等,如果比较者是两个常量,则自然相等,因为第二种输出false的情况是对n这个创建了两个对象,也就是产生两个不同的地址存到容器里,如果我不猜错的话,楼主可以先把int改成string,然后用equals方法比较,那么就都输出true了。
      

  2.   

    第二个:自动生成两个Integer对象来封装n,两个对象肯定是两个不同hashCode,所以输出false
      

  3.   

    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)
    的时候会将该范围的整数缓存起来,当再次使用的时候不会生成新的值而是用原来的。
    我觉得应该说的很清晰了吧···
      

  4.   

    “==”是比较两个对象是不是引用自同一个对象 
    “equals()”是比较两个对象的内容 
      

  5.   

    你说的对 上面两个 没运行就说出来了 其实问题就是“Java认为 -128~ 127 (byte)的范围是 最常用的,所以 自动装箱的时候(int -> Integer)
    的时候会将该范围的整数缓存起来,当再次使用的时候不会生成新的值而是用原来的。”这句话