代码:
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)
有谁知道为什么?
有时==在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方法周围的正常规则,那么该方法将不会这样做.
| 归档时间: |
|
| 查看次数: |
1471 次 |
| 最近记录: |