在Groovy脚本中,equals()和==是否相同?

时间:2015-01-28 19:31:16

标签: groovy

代码:

    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

有谁知道为什么?

2 个答案:

答案 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方法。