代码:
public class Equals {
public static void main(String[] args) {
String s1 = new String("java");
String s2 = new String("java");
if (s1 == s2) {
System.out.println("s1 == s2 is TRUE");
}
if (s1.equals(s2)) {
System.out.println("s1.equals(s2) is TRUE");
}
}
}
作为Java应用程序,输出为:
s1.equals(s2) is TRUE
这是正确的,因为s1和s2实际指向不同的内存地址。但是在GroovyConsole中的Groovy脚本中,输出是:
s1 == s2 is TRUE
s1.equals(s2) is TRUE
有谁知道为什么?
答案 0 :(得分:7)
有时Groovy中的==
会调用equals
方法,但情况并非总是这样。我将举例说明:
class EqualsTest {
@Override
boolean equals(Object obj) {
true
}
}
assert new EqualsTest() == new EqualsTest()
断言通过,所以理论似乎站了起来。但是,在以下示例中,断言失败
class EqualsTest implements Comparable<EqualsTest> {
@Override
int compareTo(EqualsTest other) {
1
}
@Override
boolean equals(Object obj) {
true
}
}
assert new EqualsTest() == new EqualsTest() // FAILS!
正如Operator Overloading中所述,如果类实现compareTo
,则相等性测试基于Comparable
的结果,否则它基于equals
。
a == b
|a.equals(b) or a.compareTo(b) == 0
==运算符并不总是与.equals()
方法完全匹配。在大多数情况下,您可以将它们视为等效的。在通过正常的Groovy“强制”机制可以认为两个对象“相等”的情况下,==
运算符会将它们报告为相等;如果这样做会破坏Java在equals方法周围的正常规则,那么.equals()
方法就不会这样做。
答案 1 :(得分:1)
是的,这些运营商是平等的。请参阅groovy中的operator overloading。 ==
运算符已转换到equals
方法。