例如,如果我有
MyClass foo = new MyClass();
MyClass bar = new MyClass();
if (foo == bar) {
// do something
}
if (foo < bar) {
// do something
}
if (foo > bar) {
// do something
}
如何比较foo
和bar
? Java是否在寻找.compareTo()
的{{1}}方法? Java是否比较了对象的实际二进制结构在内存中的位?
答案 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)
它会比较参考值,只有在foo
和bar
指向同一个对象时才会返回true。
答案 4 :(得分:1)
在Java中,“==”比较对象标识。 “new”保证每次都返回一个新的对象标识。
如果“==”会调用compareTo,我真的很喜欢。唉,它没有。