Java Integer对象大家应该都不陌生吧,今天我们就一起来探讨一下。 ).|`\=r  
  Integer i1 = 10; (JsBFz E  
  Integer i2 = 10; kHxfL#,  
  System.out.println(i1 == i2);  Y<]H1++  
    Gm9y|/rK  
  Integer a1 = 128; H1 .luHT  
  Integer a2 = 128; $gA7_kf`f  
  System.out.println(a1 == a2); AUNwp?v  
打印结果是true和false,至于为什么看了Integer源代码后就能明白,Integer有个内部类IntegerCache,它维护了一个Integer数组cache[] ,长度为256,还有一个静态块 BYY;4j${  
static { Jo?n!1  
      for(int i = 0; i < cache.length; i++) ' 9vbU2Buu  
                cache = new Integer(i - 128); plAxw 1  
} |^Tfc!bx'  
很明显这个静态块已经默认认创建出了-128~127 的 Integer 数据,这也是JAVA出于性能考虑。 |zKTz  
至于上面的代码经过编译后就变成了 _qSw}9L  
  Integer i1 = Integer.valueOf(10); *$@$7_  
  Integer i2 = Integer.valueOf(10) }=>wx+X   
  System.out.println(i1 == i2); %1UxjFn  
    'AH];JN  
  Integer a1 = Integer.valueOf(128) {!TW?+)  
  Integer a2 = Integer.valueOf(128) :)fU 3/v  
  System.out.println(a1 == a2); p{ :d y.Z  
  iXw*rWmH  
看看Integer的valueOf方法,若是在-128到127之间的数,它会直接数据引用,因为它已经创建了数据对象,但若超出这个范围,它就new了一个Integer对象。所以值为128时,每次都是不同的对象。 Fib:!z Ct  
public static Integer valueOf(int i) { Px\n&  
        final int offset = 128; 3p5|>R$w  
        if (i >= -128 && i <= 127) { // must cache  (WjE*; ~O  
                  return IntegerCache.cache[i + offset]; CD?%_ '}  
        } NLD,P {p  
        return new Integer(i); _m,IDoB2  
} Yo tP   
顺带一提,我用的JDK 1.5,若在1.4环境下Integer i1 = 10; 这种写法会报错, .7j% P|  
必须改为Integer i1 = new Integer(10); 这是因为1.5的自动装箱特性。 h A%}2fkc