2012-09-06 47 views

回答

8

Java還具有對-128 to 127之間的小整數整數池,以便表現同樣爲整型也類似於字符串常量池的

你會發現下面的代碼Integer

private static class IntegerCache { 
    static final int high; 
    static final Integer cache[]; 

    static { 
     final int low = -128; 

     // high value may be configured by property 
     int h = 127; 
     if (integerCacheHighPropValue != null) { 
      // Use Long.decode here to avoid invoking methods that 
      // require Integer's autoboxing cache to be initialized 
      int i = Long.decode(integerCacheHighPropValue).intValue(); 
      i = Math.max(i, 127); 
      // Maximum array size is Integer.MAX_VALUE 
      h = Math.min(i, Integer.MAX_VALUE - -low); 
     } 
     high = h; 

     cache = new Integer[(high - low) + 1]; 
     int j = low; 
     for(int k = 0; k < cache.length; k++) 
      cache[k] = new Integer(j++); 
    } 

    private IntegerCache() {} 
} 

另外,作爲中陳述下面毒藥回答:

Chapter 5. Conversions and Promotions

如果值p被裝箱爲真,假,一個字節或範圍在\ u0000到\ u00f之間的字符,或者在-128到127之間的一個int或短數字,則讓r1和r2爲任何兩個拳擊轉換的結果。 r1 == r2總是如此。

+0

JLS說*至少*值-128到127被緩存,而不是*到那個範圍。它甚至在討論段中說:「理想情況下,裝箱一個給定的原始值p,總會產生相同的參考。實際上,使用現有的實現技術可能是不可行的......這將允許(但不要求)共享部分或全部這些參考文獻。「 – yshavit

+0

@yshavit改爲''之間' –

2

對象池是虛擬機和/或運行時環境的工件。他們可能出於性能原因出現在那裏,但你絕不應該依賴他們。使用.equals()。

JLS指定拳擊行爲,正如在評論中指出的那樣,這部分在Integer類本身中實現;然而,另一個有趣的說法是,即使這個池的大小可以通過VM參數調整。來自Integer.java:

585  /** 
586  * Cache to support the object identity semantics of autoboxing for values between 
587  * -128 and 127 (inclusive) as required by JLS. 
588  * 
589  * The cache is initialized on first usage. The size of the cache 
590  * may be controlled by the -XX:AutoBoxCacheMax=<size> option. 
591  * During VM initialization, java.lang.Integer.IntegerCache.high property 
592  * may be set and saved in the private system properties in the 
593  * sun.misc.VM class. 
594  */ 
+0

'Integer'彙集對象,而不是JVM –

+0

啊,這很有趣。所以,與Strings不太一樣。 –

1

[5.1.7。拳擊轉換] http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

被裝箱值p爲真,假,字節,或在範圍\ u0000的一個char到\ u007f,或-128和127之間int或短號碼(含),那麼讓r1和r2是p的任何兩個裝箱轉換的結果。 r1 == r2總是如此。

但是總的來說,依靠這個將是愚蠢的,因爲您首先必須檢查該數字是否在緩存範圍內,然後有條件地使用==或equals()。 使用==表示基本類型,Class和枚舉,等於一切。