1

我是 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

4 回答 4

1

为了

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

如果您使用 来查看字节码javap -vint则会将其转换为float. 即,i2f将被调用,然后它们将使用 2 个浮点值进行比较fcmpl

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

在第三种情况下,您将原语与对象(字符串)进行比较,这是不可能的。

于 2014-09-03T08:31:55.743 回答
0
  1. 编译器接受它,因为x并且23.3f具有原始数字类型。并且比较会返回false

  2. 编译器接受它,因为 java在比较时将对象拆箱。 Doubledouble

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

于 2014-09-03T08:32:14.753 回答
0

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

于 2014-09-03T08:35:34.300 回答
0

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

  1. 因此,在第一种情况下,“x”在比较之前提升为浮点类型。
  2. 在第二个“d”未装箱和“x”在比较之前提升为 double 类型。
  3. 在第三个编译时错误发生,因为 String 与原始类型不兼容。String 可以与继承它的相同类型或类型进行比较。

编译时错误也可能发生,因为类类型不相关(也就是说,它们不一样,也不是另一个的子类),因此它们之间的强制转换总是会失败。关于类型与某个接口类型的比较,编译器允许任何比较,除非一个变量永远不能引用实现该接口的值,这是因为类型是最终类型,而最终类型的变量总是持有一个与其编译时类型相同的运行时类型的值。因此,变量的运行时类型必须是没有实现指定接口的类型。

于 2019-02-23T01:15:33.107 回答