相等運算子()
==
和 !=
運算子是二元運算子,根據運算元是否相等來計算 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 …注意這是由做出決定時在房間裡的人寫的!)