关于JAVA中相等运算符(兼容操作数)的查询
我是JAVA新手,正在经历相等运算符。在尝试了几种操作数组合之后,我对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[]);
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
编译器接受它,因为javaDouble
通过比较将对象设置为Double
原语
编译器无法接受它,因为x
是一个基本数字类型,s
是对字符串
类实例的引用。无法比较原语编号和对对象的引用
字符串是对象。
==
通过引用而不是内部值来比较对象。
所有其他(整数,双精度)
在==
中通过这些对象引用进行比较,因此在字符串不匹配的情况下,对于字符串,我们必须使用u。equals
运算符java也区分大小写,因此在比较字符串时,必须注意字符串的大小写
相等运算符意味着一些限制和转换,这些规则相当大,在语言规范中有描述
关于类型与某些接口类型的比较,编译器允许进行任何比较,除非一个变量永远不能引用实现接口的值,这是因为类型是最终类型,并且最终类型的变量始终保持与其编译时类型相同的运行时类型的值。因此,变量的运行时类型必须恰好是未实现指定接口的类型。对于字符串,有
.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