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

Jos*_*des 1 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

作为Java应用程序,输出是:

s1.equals(s2) is TRUE
Run Code Online (Sandbox Code Playgroud)

这是正确的,因为s1和s2实际上指向不同的内存地址.但是在GroovyConsole中的Groovy脚本中,输出是:

s1 == s2 is TRUE
s1.equals(s2) is TRUE
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么?

Dón*_*nal 8

有时==在Groovy中调用该equals方法,但情况并非总是如此.我将举例说明:

class EqualsTest {
    @Override
    boolean equals(Object obj) {
        true
    }
}

assert new EqualsTest() == new EqualsTest()
Run Code Online (Sandbox Code Playgroud)

断言通过,所以理论似乎站起来了.但是在以下示例中,断言失败

class EqualsTest implements Comparable<EqualsTest> {
    @Override
    int compareTo(EqualsTest other) {
        1
    }
    @Override
    boolean equals(Object obj) {
        true
    }
}

assert new EqualsTest() == new EqualsTest() // FAILS!
Run Code Online (Sandbox Code Playgroud)

运算符重载中所述,相等性测试基于compareTo类实现的结果Comparable,但是否则基于equals.

a == b| a.equals(b) or a.compareTo(b) == 0
==运算符并不总是与.equals()方法完全匹配.在大多数情况下,您可以将它们视为等效的.在通过正常的Groovy"强制"机制可以认为两个对象"相等"的情况下,==操作员将报告它们相等; .equals()如果这样做会破坏Java在equals方法周围的正常规则,那么该方法将不会这样做.