可能重複:
Why does 128==128 return false but 127==127 return true in this code?行爲包裝類的
下面的一段Java代碼返回true
Integer i1=1;
Integer i2=1;
System.out.println(i1==i2);
所以在路上,我們有字符串的概念Java中的文字常量池,在Java中的包裝類別的情況下,我們也有類似的概念嗎?
可能重複:
Why does 128==128 return false but 127==127 return true in this code?行爲包裝類的
下面的一段Java代碼返回true
Integer i1=1;
Integer i2=1;
System.out.println(i1==i2);
所以在路上,我們有字符串的概念Java中的文字常量池,在Java中的包裝類別的情況下,我們也有類似的概念嗎?
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總是如此。
對象池是虛擬機和/或運行時環境的工件。他們可能出於性能原因出現在那裏,但你絕不應該依賴他們。使用.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 */
'Integer'彙集對象,而不是JVM –
啊,這很有趣。所以,與Strings不太一樣。 –
[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和枚舉,等於一切。
JLS說*至少*值-128到127被緩存,而不是*到那個範圍。它甚至在討論段中說:「理想情況下,裝箱一個給定的原始值p,總會產生相同的參考。實際上,使用現有的實現技術可能是不可行的......這將允許(但不要求)共享部分或全部這些參考文獻。「 – yshavit
@yshavit改爲''之間' –