2011-10-06 37 views
3

我在想如果java比較int時自動將Integer變成int嗎?或者將==嘗試並比較基元上的引用?Integer == int允許在java中

這是總是對的還是我需要做i.intValue()==2

Integer i = Integer.valueOf(2); 
if (i==2){ 
//always? 
} 
+1

當你運行它時會看到什麼? –

+0

是的,運行的作品,但你可以用==比較兩個相等的字符串,有時會根據字符串的集合方式得到真或假... –

+1

這是一個稱爲[autoboxing] [1]的特性,已經在Java 1.5 。 [1]:http://stackoverflow.com/questions/166340/write-a-password-protected-zip-file-in-java – michael667

回答

10

是,使用==參數如有必要,將拆箱比較int時。從Java Language Specification

有關章節:

15.21.1數值相等運算==和=

如果相等運算符的操作數都是數字型的,或一個是!數字類型,另一個可轉換(§5.1.8)爲數字類型,則對操作數執行二進制數字提升(第5.6.2節)。如果提升類型的操作數是int或long,則執行整數相等性測試;如果升級類型爲float或double,則執行浮點相等性測試。

請注意,二進制數字提升執行值集轉換(§5.1.13)和拆箱轉換(§5.1.8)。比較是對浮點值進行精確地執行的,不管它們的表示值來自哪個值集合。

同樣適用於<<=>>=等,以及+-*等。

所以,

System.out.println(Integer.valueOf(17) == 17); 

打印true :-)

,但你可以根據字符串是如何彙集用==比較兩個字符串相等,有時得到真或FALS。 ..

對,那裏實際上也是Integers的類似情況。

當拳擊(轉化intInteger)編譯器對小的值(-128 - 127),高速緩存和重用了相同的值相同的對象,所以或許有點令人驚訝,我們有以下幾點:

System.out.println(Integer.valueOf(100) == Integer.valueOf(100)); // prints true 
System.out.println(Integer.valueOf(200) == Integer.valueOf(200)); // prints false 
1

是的,這是可行的,因爲自動(聯合國)拳擊。

4

是的,它會取消裝箱。這在section 15.21.1 of the JLS(數字==操作者)所覆蓋:

如果相等運算符的操作數都是數字型的,或一個是數字型的,另一種是可兌換(§5.1.8)到數字類型,對操作數執行二進制數字提升(第5.6.2節)。如果提升類型的操作數是int或long,則執行整數相等性測試;如果升級類型爲float或double,則執行浮點相等性測試。

請注意,二進制數字提升執行值集轉換(§5.1.13)和拆箱轉換(§5.1.8)。

(我linkified部分5.1.8因爲這是關於從Integer轉換什麼會談int可用。)

1

它會比較原語 - 在Integer會拆箱。但根據經驗:避免這種情況。總是喜歡原語,並與==

除了seeing this in the JLS比較對象時要小心,這裏是你如何驗證:

相反的Integer.valueOf(2),它採用了高速緩存,使用new Integer(2)。這是保證是一個不同的實例,如果盒裝2將獲得一個不同的實例(拳擊發生在Integer.valueOf(..))。在這種情況下,條件仍然是正確的,這意味着它不是被比較的參考。

2

是的,它會自動轉換。 你也可以做

Integer i = 2;