4

可能重复:
等于和 == 之间的差异

例如,如果我有

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()要实现的方法MyClass吗?Java 是否会逐位比较内存中对象的实际二进制结构?

4

5 回答 5

8

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

因此==!=仅当您想确定两个不同的变量是否指向同一个对象时才有用。

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

您所询问的类型的对象比较是使用诸如 之类的方法.equals或诸如String.compareTo.

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

于 2012-10-05T22:33:48.957 回答
4

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

但是,==比较左右操作数。当它们的二进制相同时,结果为真。对于对象,in 比较指针。所以这意味着只有当对象在内存中左右是同一个对象时,这才会导致 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
于 2012-10-05T22:36:21.860 回答
2

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

除非您正在处理受自动装箱约束的类型,例如Integer,否则您根本不能使用>and<对象。

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

    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");
    }
于 2012-10-05T22:35:03.977 回答
1

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

于 2012-10-05T22:34:00.263 回答
1

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

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

于 2012-10-05T22:35:11.563 回答