相等運算子()
== 和 != 運算子是二元運算子,根據運算元是否相等來計算 true 或 false。如果運算元相等,則 == 運算子給出 true,否則給出 false。如果運算元相等,則 != 運算子給出 false,否則給出 true。
這些運算子可以使用具有原始型別和引用型別的運算元,但行為明顯不同。根據 JLS,實際上有三組不同的運算子:
- 布林 ==和!=運算子。
- 數字 ==和!=運算子。
- 參考 ==和!=運算子。
但是,在所有情況下,== 和 != 運算子的結果型別都是 boolean。
數字 == 和 != 運算子
當 == 或 != 運算子的一個(或兩個)運算元是原始數字型別(byte,short,char,int, long,float 或 double)時,運算子是數字比較。第二個運算元必須是基本數字型別或盒裝數字型別。
其他數字運算子的行為如下:
- 如果其中一個運算元是盒裝型別,則將其取消裝箱。
- 如果其中一個運算元現在是 byte,short或char,它將被提升為int。
- 如果運算元的型別不相同,則具有較小型別的運算元被提升為較大型別。
- 然後進行如下比較:
- 如果提升的運算元是 int或long,則測試這些值以檢視它們是否相同。
- 如果晉升的運算元是 float或double那麼:- 兩個版本的零(+0.0和-0.0)被視為相等
- NaN值被視為不等於任何東西,並且
- 如果其 IEEE 754 表示相同,則其他值相等。
 
- 兩個版本的零(
 
- 如果提升的運算元是 
注意:使用 == 和 != 比較浮點值時需要注意。
布林 == 和 != 運算子
如果兩個運算元都是 boolean,或者一個是 boolean 而另一個是 Boolean,則這些操作符是布林 == 和 != 運算子。行為如下:
- 如果其中一個運算元是 Boolean,則它是未裝箱的。
- 測試未裝箱的運算元,並根據以下真值表計算布林結果
| A | B | A == B | A != B | 
|---|---|---|---|
| false | false | true | false | 
| false | true | false | true | 
| true | false | false | true | 
| true | true | true | false | 
有兩個陷阱使得使用 == 和 != 謹慎使用真值:
- 
如果使用 ==或!=來比較兩個Boolean物件,則使用 Reference 運算子。這可能會產生意想不到的結果; 請參閱陷阱:使用==比較原始包裝器物件,如 Integer
- 
==運算子很容易被誤認為=。對於大多數運算元型別,此錯誤會導致編譯錯誤。但是,對於boolean和Boolean運算元,錯誤會導致錯誤的執行時行為; 看陷阱 - 使用’==‘來測試布林值
參考 == 和 != 運算子
如果兩個運算元都是物件引用,則 == 和 != 運算子將測試兩個運算元是否引用同一物件。這通常不是你想要的。為了測試兩個物件是否等於由值,所述方法 .equals() 應該使用。
String s1 = "We are equal";
String s2 = new String("We are equal");
s1.equals(s2); // true
// WARNING - don't use == or != with String values
s1 == s2;      // false
警告: 在大多數情況下,使用 == 和 != 來比較 String 值是不正確的 ; 請參閱 http://stackoverflow.com/documentation/java/4388/java-pitfalls/16290/using-to-compare-strings 。類似的問題適用於原始包裝型別; 請參閱 http://stackoverflow.com/documentation/java/4388/java-pitfalls/8996/using-to-compare-primitive-wrappers-objects-such-as-integer 。
關於 NaN 邊緣案例
JLS 15.21.1 宣告如下:
如果任一運算元是
NaN,那麼==的結果是false但是!=的結果是true。事實上,當且僅當x的值為NaN時,測試x != x才是true。
這種行為(對大多數程式設計師來說)是出乎意料的。如果你測試 NaN 值是否等於它自己,答案是“不,它不是!”。換句話說,== 對於 NaN 值並不反身。
但是,這不是 Java奇怪,這種行為在 IEEE 754 浮點標準中指定,你會發現它是由大多數現代程式語言實現的。 (有關更多資訊,請參閱 http://stackoverflow.com/a/1573715/139985 …注意這是由做出決定時在房間裡的人寫的!)