2012-11-03 36 views
1

我對下面的一段代碼問題:平等運算符,奇數結果?

public class Equivalence { 
    public static void main(String[] args) { 
     Integer n1 = new Integer(47); 
     Integer n2 = new Integer(47); 
     System.out.println(n1 == n2); 
     System.out.println(n1 != n2); 
    } 
} 

輸出的結果讓我大吃一驚:

false 
true 

我已經檢查在Javadoc中的構造網絡,從沒有什麼幫助。

在此先感謝

謝謝

+0

http://stackoverflow.com/q/7520432/422353 – madth3

+0

http://stackoverflow.com/questions/1514910/when-comparing-two-integers-in-java-does-auto-取消裝箱發生 – david

回答

3

只有基本類型可以可靠地==比較。對於對象(並且Integer是對象類型),應該使用equals()方法。

==可用於對象,但僅用於檢查兩個對象是否實際上是相同的。因此,例如:

Integer n1 = new Integer(47); 
Integer n2 = n1; 
// n1 == n2 will be true 

這是最好的,如果你認爲int S作爲數字本身並Integer S作爲即時貼,上面寫有編號。 ==只會在您談論相同的便箋時纔會返回true但對於任何兩個具有相同編號的便箋都會返回true。

問題的複雜性在於,從版本1.5開始,Java也有autoboxing,也就是說,int會在需要時自動轉換爲Integer,反之亦然。如果你不小心,這可能會導致非常令人驚訝的結果。

+0

的回答很清楚,謝謝! – Twocode

+0

我在這裏有另一個問題,如果我想要創建2個不同的對象並給它們2個相同的內容,但是使用s1.equals(s2)的結果爲false,那麼String發生了什麼。謝謝 – Twocode

4

您應該使用equals檢查值相等。因爲Integer是包裝int值的包裝類。 ==根據參考檢查平等,所以在這兩種情況下您的參考是不同的。

將此對象與指定的對象進行比較。當且僅當參數不是null並且是包含與此對象相同的int值的Integer對象時,結果爲true。

n1.equals(n2); 

如果你

int n1 = new Integer(47); 
int n2 = new Integer(47); 

你會得到您所期望的輸出。

因爲Java保持從127-128的整數池還可以做

Integer n1 = Integer.valueOf(47); 
Integer n2 = Integer.valueOf(47);<-- will return you the same reference 
    n1==n2 >>> True 
+0

謝謝,但兩個值(n1和n2)看起來是相同的,請問爲什麼第一個輸出的結果是False?當我使用System.out.println(n1.equals(n2))時,正如我想的那樣正確。 – Twocode

+0

非常感謝! – Twocode

1

n1 == n2比較對象實例因此n1 == n2將返回falsen1 != n2將返回truen1n2不相同的對象的實例。

如果使用equals方法或獲取int (primitive tpye)值,然後比較使用== or !=你會得到正確的結果如

System.out.println(n1.equals(n2)); //true 
    System.out.println(!n1.equals(n2));//false 

System.out.println(n1.intValue() == n2.intValue()); //true 
    System.out.println(n1.intValue() != n2.intValue()); //false 
+0

嗨,你的回答是使用2個類似的陳述:P,只是讓你知道 – Twocode

+0

@Twocold:哪兩個陳述?請檢查,其工作如上所述。 –

+0

第一個是n1!= n2返回false,但你又有一個,n1!= n2返回true :) – Twocode

1

我相信這是因爲你沒有比較N1的值和n2您對比的對象引用。而且由於它們是兩個不同的對象,它們的引用不一樣。

因此,你應該使用equals()方法來比較它們的值

1

java.Lang.Integer是Java中的object。您應該使用equals()方法檢查兩個Integer對象是否相等方法

您正在檢查n1是否引用Integer對象,並且n2引用另一個Integer對象是否引用同一個Integer對象。因爲==運算符會檢查兩個引用變量是否指向同一個對象。在這種情況下他們不是。 嘗試

   Integer n1 = New Integer(47); 
       Integer n2 = New Integer(47); 
       System.out.println(n1.equals(n2)); 
       System.out.println(n1.equals(n2)); 
+0

謝謝,我想我int和整數之間的困惑。感謝您指出了這一點。 – Twocode