第一个一定是false,以为==是比较引用是否引用同一个对象,显然不是同一个,为false

解决方案 »

  1.   

    假如初始值为129,两者都是false
    -----------------------------

      Integer i = new Integer(129);
      Integer y = new Integer(129);
    这样吗?
      

  2.   

    因为 i 和 j 本身就是 Integer 类型的值,在第二句比较的,也仅仅是对象之间的比较,并不是基本数据类型之间的比较,只不过在计算时转换成了 int 类型,拆箱计算后,对于 [-128,127] 之间的值,在内存中会进行重用,i 和 j 的指针都指向了同一块地方,就像字符串一样,但是对于这个范围之外的值就不会进行重用了,会给它们开僻新的空间。参考《Java语言规范》
    http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7
      

  3.   

    首先要明白自动打包和拆包到底是什么对于int和Integer来讲
    自动打包就是调用Integer.valueOf()
    自动拆包就是调用Integer.intValue()1. Integer   i   =   new   Integer(128); 
    2. Integer   j   =   new   Integer(128); 
    3. System.out.println(i   ==   j); 
    4. i--; 
    5. j--; 
    6. System.out.println(i   ==   j); 前三行不说了,就是两个对象比较地址
    第四行相当于
    int n = i.intValue();
    n--;
    i = Integer.valueOf(n);
    第五行相当于
    int m = j.intValue();
    m--;
    j = Integer.valueOf(m);关键是Integer.valueOf()这个方法,下面是源代码
    public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
            return new Integer(i);
        }这是IntegerCache内部类的源代码
    private static class IntegerCache {
    private IntegerCache(){} static final Integer cache[] = new Integer[-(-128) + 127 + 1]; static {
        for(int i = 0; i < cache.length; i++)
    cache[i] = new Integer(i - 128);
    }
        }
    cache这个Integer的数组存放了值为-128到127的Integer的对象
    他是static的,也就是说随着IntegerCache这个类被加载,Integer(-128)到Integer(127)这256个对象就被留在了内存里,除非这个类被卸载掉由于n--之后变为127,在-128到127范围内
    Integer valueOf(127)返回的就是IntegerCache.cache[127 + 128]
    所以i就是IntegerCache.cache[127 + 128],即i指向了chche[255]指向的那个对象。
    同样j也是IntegerCache.cache[127 + 128],j也指向了chche[255]指向的那个对象。但是129的情况就不一样了,--后得到的是128,128不在范围-128到127之中
    所以返回的是new Integer(128)
    i,j指向了两个不同的对象
      

  4.   

    试试这个
    Integer i = new Integer(129);
    Integer j = new Integer(129);
    127内的从对象池中取。