2010-08-17 36 views
10

可能重複:
Weird Java BoxingJava的==操作符

嗨,

有人可以解釋爲什麼在過去打印返回false?

int a = 100; 
int b = 100; 

System.out.println(a == b); // prints true 

Integer aa = 100; 
Integer bb = 100; 

System.out.println(aa == bb); // prints true 

Integer aaa = 1000; 
Integer bbb = 1000; 

System.out.println(aaa == bbb); // prints false 

感謝 邁克爾

+3

重複:http://stackoverflow.com/questions/3130311/weird-java-boxing – Progman 2010-08-17 20:02:25

+1

是的,這是一種欺騙過很多次。另外http://stackoverflow.com/questions/3131136/integers-caching-in-java-closed,http://stackoverflow.com/questions/1514910/when-comparing-two-integers-in-java-does-auto -unboxing-occurrence – 2010-08-17 20:04:24

回答

14

第二次打印評估爲true的原因是因爲Integer類緩存了前128個Integer對象。你想使用。 equals

+2

是的,這是正確的答案。另請參閱:http://www.owasp.org/index.php/Java_gotchas「不可變對象/包裝類緩存」 – 2010-08-17 20:01:14

+2

這可能是我的頭號人物不喜歡Java的「特性」。談論不一致。 – 2010-08-17 20:05:07

+1

我真的很想能夠明確禁用初始化自動裝箱。 – 2010-08-17 20:07:44

1

你比較,而不是兩個值的兩個Integer對象,它使用==操作符的兩個參考比較。使用equals()方法確保您正在比較兩個值。

+1

什麼是輸出'System.out.println(aa == bb);' – Anycorn 2010-08-17 19:59:48

+0

-1因爲aa == bb打印爲真。 – 2010-08-17 20:01:58

+0

+1,因爲這是完全正確的,即使它沒有完全解釋。 – 2010-08-17 20:05:41

0

您必須使用Integer.compareTo來測試Integer對象的數值相等。 ==運算符正在比較對象,而不是數字。

+1

你也可以使用Integer.equals。 – Yishai 2010-08-17 20:00:57

0

Integer對象使用該方法Integer.valueOf(int) autoboxed。查看該方法的文檔。那麼一切都應該變得清晰。

0

你想要使用的是aaa.equals(bbb)。在Java中,使用== on對象比較它們是否與對象的實例相同,而不是根據它們的equals()方法是否相等。

0

我很驚訝第二種情況返回true。但是,爲什麼在Java Puzzlers他們建議不要混合使用Wrapper類和==運算符。

看看這個類代碼:

public class RichardInt { 
    private int value; 
    public RichardInt(int value) { 
     this.value = value; 
    } 
} 

什麼是下面的結果呢?

RichardInt aa = new RichardInt(100); 
RichardInt bb = new RichardInt(100); 
System.out.println(aa == bb); // prints false 

由於等號運算符==與對象一起使用時比較引用,因此它會打印爲false。請記住,在Java中,對象是引用類型,而基元(如int)是值類型。 (注:有人可以讓我知道,如果我錯用「價值型」我有一種感覺,我是誰?)。以下將打印真:

RichardInt aa = new RichardInt(100); 
RichardInt bb = aa; 
System.out.println(aa == bb); // prints true 

...因爲aabb引用相同的實例RichardInt

所以,或許上述行爲在下面的例子中更容易理解......

Intger aaa = new Intger(1000); 
Intger bbb = new Integer(1000); 
System.out.println(aaa == bbb); // prints false 

在較新版本的Java,包裝類(IntegerFloatBoolean等)可以自動箱,這意味着你可以做到以下幾點:

Integer aa = 1000; 
// this is a shorthand for... 
// Integer aa = new Integer(1000); 

但它會導致混亂的行爲,當你嘗試這樣的事情:

Integer aaa = 1000; 
Integer bbb = 1000; 
System.out.println(aaa == bbb); // prints false 

甚至更​​好,你可以用這樣的難題最終...

// what values of x and y will result in output? 
if(!(x<y)&&!(x>y)&&!(x==y)) { 
    System.out.println("How is this possible?"); 
} 

最後,無論何時處理對象,您都需要使用.equals()而不是==

Integer aaa = 1000; 
Integer bbb = 1000; 
System.out.println(aaa.equals(bbb)); // prints true