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

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

在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月前
|
Java
java equals和==
==是进行对象的地址值比较,如果确实需要字符串的内容比较,可以使用两个方法 public boolean equals(0bjectobj):参数可以是任何对象,只有参数是一个字符串并且内 容相同的才会给true;否则返回false 注意事项: 1.任何对象都能用object进行接收。 2.equals方法具有对称性,也就是a.equals(b)和b.equals(a)效果一样。 3.如果比较双方一个常量一个变量,推荐把常量字符串写在前面。 推荐:"abc".equals(str) 不推荐:str.equals("abc") public boolean egualsIgnoreCas
10 1
|
1月前
|
Java
Java中常见需要重写equals方法的类
Java中常见需要重写equals方法的类
|
3月前
|
Java
Java中 ==与equals的区别
Java中 ==与equals的区别
17 1
|
4月前
|
Java
JAVA中比较对象是否相等的方式是什么?为什么重写equals就一定要重写hashcode?百天百题(3/100)
JAVA中比较对象是否相等的方式是什么?为什么重写equals就一定要重写hashcode?
|
4月前
|
存储 算法 Java
史上最全的Java容器集合之equals 和 hashCode
史上最全的Java容器集合之equals 和 hashCode
37 0
|
5月前
|
Java
在Java语言中,==、equals 和 equalsIgnoreCase 是用于比较对象或值的三个不同的方法。
在Java语言中,==、equals 和 equalsIgnoreCase 是用于比较对象或值的三个不同的方法。
|
6月前
|
Java
【Java用法】Java 语言规范要求 equals 方法具有的特性
【Java用法】Java 语言规范要求 equals 方法具有的特性
36 0
|
6月前
|
IDE Java Apache
Eclipse 安装了 Groovy 开发插件之后,双击打不开 .java 文件了
Eclipse 安装了 Groovy 开发插件之后,双击打不开 .java 文件了
44 0
|
7月前
|
存储 算法 Java
Java 中的 == 运算符、equals 方法和 hashCode 方法
HashMap 中键是不可以重复的,因此它的键就必须是不同的对象,那么这个时候就先用计算速度快的 hashCode 进行比较,若哈希值都不相等,那么这两个对象必然不相等,若是相等的,那么这个就有两种可能出现,一种情况是这两个对象是真的相等,另外一种情况就是出现了罕见的“哈希冲突”现象,那么这个时候就轮到 equals 来进行判断了!在 HashMap 中,键是不可以重复的,也就是说,它们的键都是不相同的,因此就要判断不同对象是否为同一对象。因此,哈希值可以用于判断两个对象是否不等。
70 1