Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于JAVA中相等运算符(兼容操作数)的查询_Java_Equality Operator - Fatal编程技术网

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

关于JAVA中相等运算符(兼容操作数)的查询,java,equality-operator,Java,Equality Operator,我是JAVA新手,正在经历相等运算符。在尝试了几种操作数组合之后,我对Java中等式运算符(=)的兼容操作数的定义有点困惑 所以,在我看来,对于等式运算符,应该有一些兼容操作数的正式定义。请帮我澄清这个疑问。有关 int x = 23; if (x == 23.3f) 如果使用javap-v查看字节码,则int将转换为浮点值。i、 e,i2f将被调用,然后使用fcmpl将它们作为两个浮点值进行比较 public static void main(java.lang.String[]);

我是JAVA新手,正在经历相等运算符。在尝试了几种操作数组合之后,我对Java中等式运算符(=)的兼容操作数的定义有点困惑

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

有关

int x = 23;
if (x == 23.3f) 
如果使用
javap-v
查看字节码,则
int
将转换为
浮点值。i、 e,
i2f
将被调用,然后使用
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
在第三种情况下,您将原语与对象(字符串)进行比较,这是不可能的

  • 编译器接受它,因为
    x
    23.3f
    具有原始数字类型。比较将返回
    false

  • 编译器接受它,因为java
    Double
    通过比较将对象设置为
    Double
    原语

  • 编译器无法接受它,因为
    x
    是一个基本数字类型,
    s
    是对
    字符串
    类实例的引用。无法比较原语编号和对对象的引用

  • 字符串是对象。
    ==
    通过引用而不是内部值来比较对象。
    所有其他
    (整数,双精度)
    ==
    中通过这些对象引用进行比较,因此在字符串不匹配的情况下,对于字符串,我们必须使用u
    。equals
    运算符java也区分大小写,因此在比较字符串时,必须注意字符串的大小写

    相等运算符意味着一些限制和转换,这些规则相当大,在语言规范中有描述

  • 所以在第一种情况下,在比较之前,“x”被提升为float类型
  • 在第二次比较之前,将“d”取消装箱,并将“x”升级为双精度类型
  • 在第三个编译时错误发生,因为字符串与基元类型不兼容。字符串可以与继承它的相同类型进行比较 编译时错误也可能发生,因为类类型是不相关的(也就是说,它们不相同,也不是另一个的子类),所以它们之间的转换总是会失败。
    关于类型与某些接口类型的比较,编译器允许进行任何比较,除非一个变量永远不能引用实现接口的值,这是因为类型是最终类型,并且最终类型的变量始终保持与其编译时类型相同的运行时类型的值。因此,变量的运行时类型必须恰好是未实现指定接口的类型。

    对于字符串,有
    .equals
    方法。在上一篇
    if
    中,很明显它们是不兼容的,因为您试图将一个对象(字符串)与一个基本类型(int、long、double…)进行比较。我理解。equals在那里,但我的查询是关于==。如果您看到我的第二个示例,我将原语与对象(Double)进行比较,编译器接受它。关于#2,当您的另一个操作数是原语时,总是会发生取消装箱?根据官方定义:
    Autoboxing(和取消装箱)是Java编译器在基元类型及其相应的对象包装类之间进行的自动转换。
    基元类型和相应的对象包装类示例:
    int
    Integer
    double
    double
    ,相比之下,如果一个操作数是包装类实例,而另一个操作数是基元类型,则会发生取消装箱。此外,如果两个操作数都是包装类实例,即整数,则java会比较这些对象的值,而不是引用。要比较
    Double
    和/或
    Double
    值,请不要使用
    =
    运算符。使用
    java.lang.Double.compare()
    方法。这是因为精度问题。查看此链接,例如:我也建议您避免使用2号。就我而言,我永远记不起它是装箱原语还是取消装箱对象,结果在这两种情况下是不一样的。因此,为了可读性,如果这是您想要的,请明确取消装箱,如
    x==d.doubleValue()
    (不过,我也同意警告不要将双精度值与
    =
    进行比较)。
    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