2011-05-03 44 views
2

嘿,我遇到了一個有趣的事件,正在尋找一個解釋。整數構造變化

在Java 1.6:

Integer a = new Integer(5); 
Integer b = new Integer(5); 

System.out.println(a == b); 

Integer c = 5; 
Integer d = 5; 

System.out.println(c == d); 

我得到:

false 
true 

在Eclipse我在調試器檢查。 ab是不同的對象,而cd是相同的對象(但不同於ab)。

任何人都可以線索我在引擎蓋下發生了什麼?這是JVM的魔力?意識到一個Integer(5)已經在棧中?

回答

6

Java高速緩存Integer如果它們是常量,則認爲它的值足夠接近零。使用new手動創建Integer會繞過該緩存。您可以撥打Integer.valueOfint以獲得相應的Integer而不繞過緩存。

您可能需要在搜索引擎上搜索「JVM整數緩存」以獲取更多信息。

+0

我相信從-128到127的所有值都被緩存了,而且我很確定它是用於Sun的JVM。 – st0le 2011-05-03 04:49:25

+0

另請參見['Integer.valueOf(int i)'](http://download.oracle.com/javase/6/docs/api/java/lang/Integer.html#valueOf%28int%29) – trashgod 2011-05-03 04:49:54

+0

此外,則允許jvm緩存通過Integer.valueOf獲取的整數,因此即使數字在-128-127範圍之外,您也可以返回兩次調用Integer.valueOf的對象。 – MeBigFatGuy 2011-05-03 04:51:39

1

@ icktoofay的答案指出它,但評論是渾水摸魚。

  • 的JLS版3.0 要求,在整數範圍-128到+127的autoboxed到高速緩存的值;見JLS section 5.1.7。換句話說,對於所有投訴Java 5及更高版本的平臺,您可以將此行爲用於該範圍內的整數。

    (類似的規定適用於布爾值,字節,字符和短褲。)

  • 的JLS具體允許同一自動裝箱行爲在更寬的值範圍。

+0

啊,我明白了。我意識到自動裝箱,但沒有意識到緩存的值有牽連。非常整潔的小東西。 – 2011-05-03 05:24:07