相等運算子()

==!= 運算子是二元運算子,根據運算元是否相等來計算 truefalse。如果運算元相等,則 == 運算子給出 true,否則給出 false。如果運算元相等,則 != 運算子給出 false,否則給出 true

這些運算子可以使用具有原始型別和引用型別的運算元,但行為明顯不同。根據 JLS,實際上有三組不同的運算子:

  • 布林 ==!= 運算子。
  • 數字 ==!= 運算子。
  • 參考 ==!= 運算子。

但是,在所有情況下,==!= 運算子的結果型別都是 boolean

數字 ==!= 運算子

==!= 運算子的一個(或兩個)運算元是原始數字型別(byteshortcharint, longfloatdouble)時,運算子是數字比較。第二個運算元必須是基本數字型別或盒裝數字型別。

其他數字運算子的行為如下:

  1. 如果其中一個運算元是盒裝型別,則將其取消裝箱。
  2. 如果其中一個運算元現在是 byteshortchar,它將被提升為 int
  3. 如果運算元的型別不相同,則具有較小型別的運算元被提升為較大型別。
  4. 然後進行如下比較:
    • 如果提升的運算元是 intlong,則測試這些值以檢視它們是否相同。
    • 如果晉升的運算元是 floatdouble 那麼:
      • 兩個版本的零(+0.0-0.0)被視為相等
      • NaN 值被視為不等於任何東西,並且
      • 如果其 IEEE 754 表示相同,則其他值相等。

注意:使用 ==!= 比較浮點值時需要注意。

布林 ==!= 運算子

如果兩個運算元都是 boolean,或者一個是 boolean 而另一個是 Boolean,則這些操作符是布林 ==!= 運算子。行為如下:

  1. 如果其中一個運算元是 Boolean,則它是未裝箱的。
  2. 測試未裝箱的運算元,並根據以下真值表計算布林結果
A B A == B A != B
false false true false
false true false true
true false false true
true true true false

有兩個陷阱使得使用 ==!= 謹慎使用真值:

參考 ==!= 運算子

如果兩個運算元都是物件引用,則 ==!= 運算子將測試兩個運算元是否引用同一物件。這通常不是你想要的。為了測試兩個物件是否等於由值,所述方法 .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 …注意這是由做出決定時在房間裡的人寫的!)