Groovy - == 一定等价于 Java 的 equals() 吗?

本文深入探讨了Groovy语言中==操作符与is()方法的区别,特别是在与Java中的equals()方法交互时的复杂行为。文章通过具体示例解释了在不同情况下,如比较字符串或自定义类实例时,这两个操作符如何工作,以及它们在对象引用和值比较上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Java中,==equals()是一个混乱之源,而Groovy加剧了这种混乱。Groovy将==操作符映射到了Java中的equals()方法。假如我们想比较引用是否相等(也就是原始的==的语义),该怎么办呢?必须使用Groovy中的is()。下面通过一个例子来理解其区别。

GroovyForJavaEyes/Equals.groovy

str1 = 'hello'
str2 = str1
str3 = new String('hello')
str4 = 'Hello'

println "str1 == str2: ${str1 == str2}"
println "str1 == str3: ${str1 == str3}"
println "str1 == str4: ${str1 == str4}"

println "str1.is(str2): ${str1.is(str2)}"
println "str1.is(str3): ${str1.is(str3)}"
println "str1.is(str4): ${str1.is(str4)}"

来看一下Groovy中==操作符的行为以及使用is()方法的结果:

str1 == str2: true
str1 == str3: true
str1 == str4: false
str1.is(str2): true
str1.is(str3): false 
str1.is(str4): false

观察发现,Groovy的==映射到equals(),这个结论并不总是成立,当且仅当该类没有实现Comparable接口时,才会这样映射。如果实现了Comparable接口,则==会被映射到该类的compareTo()方法。

下面例子说明了这种行为。

GroovyForJavaEyes/WhatsEquals.groovy

class A {
  boolean equals(other) {
    println "equals called"
    false
  }
}

class B implements Comparable {
  boolean equals(other) {
    println "equals called"
    false
  }

  int compareTo(other) {
    println "compareTo called"
    0
  }
}

new A() == new A()
new B() == new B()

下面的输出显示,Comparable的优先级高:

equals called
compareTo called

通过输出可以看到,在实现了Comparable接口的类上,==操作符选择了compareTo(),而不是equals()

注意 在比较对象时,请首先问一下自己,要比较的是引用还是值。然后再问一下,是不是使用了正确的操作符。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆克和他的代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值