2012-09-22 57 views
28

我有以下代碼:比較整數對象

public class Test { 

    public static void main(String[] args) { 

     Integer alpha = new Integer(1); 
     Integer foo = new Integer(1); 

     if(alpha == foo) { 
      System.out.println("1. true"); 
     } 

     if(alpha.equals(foo)) { 
      System.out.println("2. true"); 
     } 

    } 

} 

輸出如下:

2. true 

然而改變Integer objectint的類型會產生不同的輸出,例如:

public class Test { 

    public static void main(String[] args) { 

     Integer alpha = new Integer(1); 
     int foo = 1; 

     if(alpha == foo) { 
      System.out.println("1. true"); 
     } 

     if(alpha.equals(foo)) { 
      System.out.println("2. true"); 
     } 

    } 

} 

新產出:

1. true 
2. true 

這是怎麼回事?爲什麼第一個示例代碼沒有輸出1. true

+5

你確定第一個輸出不是2.是真的嗎?否則,沒有任何意義。 – ILMTitan

+0

是的,對不起,格式化將2更改爲1. –

+2

可能的重複:[比較Java中的兩個整數是否會自動取消裝箱?](http://stackoverflow.com/q/1514910/1164465) –

回答

31

對於參考類型,==檢查引用是否相等,即它們是否指向相同的對象。

對於原始類型,==檢查值是否相等。

java.lang.Integer是一個參考類型。 int是一種原始類型。

編輯:如果一個操作數是原始類型,而另一個是取消裝箱到合適基元類型的引用類型,那麼==將比較值,而不是引用。

+0

謝謝,這使我清醒了。 –

+6

對於問題和答案+1。只是爲了確保:在情況'(Integer == int)'或'(int == Integer)'中,它總是被解除盒裝('int == int)'不自動裝箱到'(Integer == Integer)'? – Pshemo

+0

@Pshemo:正確。 – meriton

4

== for objects檢查引用是否相同,這就是爲什麼它返回false爲Integers。然而,對於基本類型(整數,浮點數,...)它會檢查是否相等,這就是爲什麼你會成爲現實。

我應該提到,在第一種情況下,比較Integer和int時,int會轉換爲Integer對象(自動裝箱),然後進行參考比較。由於它們不同,它返回false。

7

整數對象是對象。這聽起來合乎邏輯,但是這個問題的答案。對象使用關鍵字new以Java編寫,然後存儲在內存中。比較時,比較對象的內存位置,而不是對象的值/屬性。

使用.equals()方法,你實際的比較值的對象/屬性,而不是他們在內存中的位置:

new Integer(1) == new Integer(1)回報false,而new Integer(1).equals(new Integer(1))回報true


int s是java的原始類型。當你創建一個int時,所引用的就是這個值。當比較Java中的任何基元類型時,所有比較的都是值,而不是內存位置。這就是爲什麼5 == 5總是返回true。

當您將Integer對象與基元類型進行比較時,如果可能,該對象將轉換爲基元類型。有Integerint這是可能的,所以他們進行比較。這就是爲什麼Integer(1).equals(1)返回true。

+0

+1以獲得清晰的解釋。 – HybrisFreelance

1

整數==這裏INT自動拳擊施加(以便整數轉換對比之前爲int),所以真..但這裏整數==整數對象比較,以便參考是不同的,所以假..

0

第一個例子: 在對象之間使用==運算符會檢查引用是否相等,並且由於您正在比較兩個不同的對象,因此它們不相等。

第二個示例: 在包裝類型(Integer,Long等)和數值類型(int,long等)之間使用==時,將包裝類型解除裝箱並在兩種基本數字類型(即intint之間的Ie)。拆箱是二進制數字升級的一部分,請閱讀更多:http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2

1

要使用new Integer(1)創建新對象,每次都會創建一個完全不同的對象,即使它具有相同的值。 '=='檢查對象是否相同,而不是數據值。在你的情況下,你可以檢查的值如下:

if(alpha.intValue() == foo.intValue()) { 
// 
}