查询JAVA中的相等运算符(兼容操作数)

时间:2014-09-03 08:26:26

标签: java equality-operator

我是JAVA的新手并且正在通过相等运算符。在尝试了几个操作数组合之后,我对Java中相等运算符(==)的兼容操作数的定义究竟是什么感到困惑。

int x = 23;
if (x == 23.3f) {   // compiler accepts it. (may be because both are primitives)

int x = 23;     
Double d = new Double(23.3); 
if (x == d) {    // compiler accepts it. (may be compatible pair of primitive and object reference)

int x = 23;
String s = "hello";
if (x == s)   // compiler throws error  - incompatible operands for == operator.

所以,在我看来,对于相等运算符应该有一些正确的兼容操作数定义。请帮我澄清这个疑问。

4 个答案:

答案 0 :(得分:1)

对于

int x = 23;
if (x == 23.3f) 

如果使用javap -v查看字节代码,int将转换为float。即,i2f将被调用,然后使用fcmpl将它们作为2个浮点值进行比较。

public static void main(java.lang.String[]);
  Code:
   Stack=2, Locals=2, Args_size=1
   0:   bipush  23
   2:   istore_1
   3:   iload_1
   4:   i2f       // The line of interest. Converts int to float.
   5:   ldc     #16; //float 23.3f
   7:   fcmpl     // compare two floats
   8:   ifne    11
   11:  return

在第三种情况下,您将基元与Object(String)进行比较,这是不可能的。

答案 1 :(得分:0)

  1. 编译器接受它,因为x23.3f具有原始数字类型。比较将返回false

  2. 编译器接受它,因为java unboxes Double在比较时反对double原语。

  3. 编译器无法接受它,因为x是原始数字类型,s是对String类实例的引用。无法比较数字原语和对象的引用。

答案 2 :(得分:0)

字符串是对象。  ==按引用比较对象,而不是按内部值比较。 所有其他(int, double)==中通过对象引用进行比较,因此在字符串的情况下它不匹配所以对于字符串我们必须u .equals运算符也是java区分大小写,所以在比较字符串时你必须照顾Case's of strings

答案 3 :(得分:0)

等价运算符暗含一些限制和转换,规则相当大,并在语言规范https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.21

中进行了描述
  1. 因此,在第一种情况下,“ x”在比较之前升为浮点型。
  2. 在第二个未加框的“ d”框中,“ x”在比较之前升为双倍类型。
  3. 在第三次编译时发生错误,因为String与原始类型不兼容。可以将字符串与继承它的相同类型进行比较。

也可能发生编译时错误,因为类类型是不相关的(也就是说,它们是不相同的,并且两者都不是另一个的子类),因此它们之间的强制转换将始终失败。 关于类型与某种接口类型的比较,编译器允许进行任何比较,除非一个变量永远不能引用实现该接口的值,这是因为类型是最终类型,而最终类型的变量始终包含一个运行时类型与其编译时类型相同的值。因此,变量的运行时类型必须与未实现指定接口的类型完全相同。