相等运算符()
==
和 !=
运算符是二元运算符,根据操作数是否相等来计算 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 …注意这是由做出决定时在房间里的人写的!)