Integer探討

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  
相關文章
相關標籤/搜索