2014-09-03 17 views
1

我是JAVA的新手,正在通过相等运算符。在尝试了几种操作数组合之后,我对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. 

因此,它看起来对于我来说,对于相等运算符应该有一些兼容操作数的正式定义。请帮我澄清这个疑问。

+0

字符串有'.equals'方法。并在你的最后一个'如果'它显然,他们是不兼容的,因为你是比较一个对象(字符串)与原始类型(int,long,double ...) – 2014-09-03 08:30:44

+0

我明白.equals在那里,但我的查询是专门针对==的。如果你看到我的第二个例子,我将Object与Object(Double。)进行比较,然后编译器接受它。 – pankaj 2014-09-03 08:39:00

回答

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

  2. 编译器接受它,因为java unboxesDouble反对double比较基元。

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

+0

关于#2,当您的其他操作数是原始的时候,拆箱总是会发生? – pankaj 2014-09-03 08:41:41

+0

根据官方定义:'自动装箱(和拆箱)是Java编译器在原语类型和它们相应的对象包装类之间进行的自动转换.'原始类型和相应的对象包装类例子:'int'和'Integer' ,'double'和'Double'等。比较一下,如果一个操作数是一个包装类实例,而另一个操作数是一个原始类型,那么拆箱就会发生。而且,如果两个操作数都是包装类实例,即Integer,那么java会比较这些对象的值,而不是引用。 – 2014-09-03 08:52:31

+2

比较'Double'和/或'double'值不要使用'=='运算符。使用'java.lang.Double.compare()'方法。这是因为精度问题。检查此链接,例如:http://www.tutorialspoint.com/java/lang/double_compare.htm – 2014-09-03 08:53:20

1

对于

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

如果你看一下使用javap -v字节码,该int将被转换为一个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 

在第三种情况下,您正在比较原始数据与Object(String),这是不可能的。

0

字符串是对象。 ==通过引用比较对象,而不是内部值。 所有其他(int, double)==一起比较有对象的引用,以便在字符串的情况下,它不匹配这样的字符串,我们必须ü.equals运营商还Java是区分大小写,因此在比较字符串ü必须照顾Case's of strings

相关问题