我在想如果java比較int時自動將Integer變成int嗎?或者將==嘗試並比較基元上的引用?Integer == int允許在java中
這是總是對的還是我需要做i.intValue()==2
?
Integer i = Integer.valueOf(2);
if (i==2){
//always?
}
我在想如果java比較int時自動將Integer變成int嗎?或者將==嘗試並比較基元上的引用?Integer == int允許在java中
這是總是對的還是我需要做i.intValue()==2
?
Integer i = Integer.valueOf(2);
if (i==2){
//always?
}
是,使用==
參數如有必要,將拆箱比較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
的類似情況。
當拳擊(轉化int
到Integer
)編譯器對小的值(-128 - 127),高速緩存和重用了相同的值相同的對象,所以或許有點令人驚訝,我們有以下幾點:
System.out.println(Integer.valueOf(100) == Integer.valueOf(100)); // prints true
System.out.println(Integer.valueOf(200) == Integer.valueOf(200)); // prints false
這是可能的。
Java特徵被稱爲Autoboxing。
是的,這是可行的,因爲自動(聯合國)拳擊。
是的,它會取消裝箱。這在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
可用。)
它會比較原語 - 在Integer
會拆箱。但根據經驗:避免這種情況。總是喜歡原語,並與==
除了seeing this in the JLS比較對象時要小心,這裏是你如何驗證:
相反的Integer.valueOf(2)
,它採用了高速緩存,使用new Integer(2)
。這是保證是一個不同的實例,如果盒裝2
將獲得一個不同的實例(拳擊發生在Integer.valueOf(..)
)。在這種情況下,條件仍然是正確的,這意味着它不是被比較的參考。
是的,它會自動轉換。 你也可以做
Integer i = 2;
當你運行它時會看到什麼? –
是的,運行的作品,但你可以用==比較兩個相等的字符串,有時會根據字符串的集合方式得到真或假... –
這是一個稱爲[autoboxing] [1]的特性,已經在Java 1.5 。 [1]:http://stackoverflow.com/questions/166340/write-a-password-protected-zip-file-in-java – michael667