在Java中使用==,>,<等等比较两个相同类型的对象会发生什么?

时间:2012-10-05 22:32:12

标签: java conditional

  

可能重复:
  Difference Between Equals and ==

例如,如果我有

MyClass foo = new MyClass();
MyClass bar = new MyClass();

if (foo == bar) {
    // do something
}
if (foo < bar) {
    // do something
}
if (foo > bar) {
    // do something
}

如何比较foobar? Java是否在寻找.compareTo()的{​​{1}}方法? Java是否比较了对象的实际二进制结构在内存中的位?

5 个答案:

答案 0 :(得分:8)

算术比较运算符==!=非常简单地比较对象引用或对象的内存地址。 ><以及相关的运算符不能与对象一起使用。

所以==!=仅在您想确定两个不同的变量是否指向相同的对象时才有用。

作为一个例子,这在事件处理程序中很有用:如果你有一个事件处理程序绑定到例如多个按钮,您需要在处理程序中确定按下了哪个按钮。在这种情况下,您可以使用==

使用.equals等方法或String.compareTo等特殊用途方法捕获您要询问的类型的对象比较。

值得注意的是,默认的Object.equals方法等同于==:它比较对象引用;这在the docs中有所涉及。 Java中构建的大多数类都使用自己的实现覆盖equals:例如,String会覆盖equals以一次比较一个字符。要为您自己的对象获得.equals的更具体/更有用的实现,您需要使用更具体的实现覆盖.equals

答案 1 :(得分:4)

显然,您没有亲自尝试,因为<><=>=不适用于对象。

但是,==会比较左右操作数。当它们是二进制相同时,它会导致真实。在对象的情况下,比较指针。所以这意味着如果Object在内存中是同一个对象,那么结果为true。

其他方法(如compareTo和equals)用于提供与内存中不同对象进行比较的自定义方法,但它们可能彼此相等(即数据相同)。

如果是字符串,例如:

String str0 = new String("foo");
String str1 = new String("foo");

// A human being would say that the two strings are equal, which is true
// But it are TWO different objects in memory. So, using == will result
// in false

System.out.println(str0 == str1); // false

// But if we want to check the content of the string, we can use the equals method,
// because that method compares character by character of the two objects

String.out.println(str0.equals(str1)); // true
String.out.println(str1.equals(str0)); // true

答案 2 :(得分:2)

不,不。它比较两个变量是否是对同一对象的引用。

除非您正在处理受自动装箱影响的类型,例如Integer,否则您无法将><用于对象。

在使用自动装箱类型的情况下,java不会查找特定方法,但会自动取消装箱变量,将它们转换为基元 - 但对于equals运算符则不是这种情况。 ==运算符将始终将对象作为引用进行比较,即使在比较自动装箱对象时也是如此:

    Integer i1 = new Integer(10);
    Integer i2 = new Integer(10);

    if(i1 < i2) { // evaluates to false!
        System.out.println("i1 is less than i2");
    }
    else if(i1 > i2) { // evaluates to false!
        System.out.println("i1 is greater than i2");
    }
    else if(i1 == i2) { // evaluates to false!
        System.out.println("i1 and i2 are equal");
    }
    else {
        System.out.println("Um... well that's just confusingi");
    }

答案 3 :(得分:1)

它会比较参考值,只有在foobar指向同一个对象时才会返回true。

答案 4 :(得分:1)

在Java中,“==”比较对象标识。 “new”保证每次都返回一个新的对象标识。

如果“==”会调用compareTo,我真的很喜欢。唉,它没有。