Рассмотрим следующий сценарий:
def a = new HashSet()
def str1 = "str1"
def str2 = "str2"
def b = "$str1-$str2"
def c = "str1-str2"
println "b: $b"
println "c: $c"
println "b.equals(c): " + (b.equals(c))
println "b == c: " + (b == c)
println "b.compareTo(c): " + (b.compareTo(c))
a.add(b)
println "a.contains(c): " + a.contains(c)
Который дает следующий результат при запуске с Groovy 1.8 и JDK 1.6.0_14:
b: str1-str2
c: str1-str2
b.equals(c): false
b == c: true
b.compareTo(c): 0
a.contains(c): false
две строки «b» и «c» печатают одну и ту же последовательность символов, но b.equals (c) ложно. Согласно руководству JDK 1.6, функция equals () должна возвращать:
Сравнивает эту строку с указанным объектом. Результат верен тогда и только тогда, когда аргумент не равен нулю и является объектом String, который представляет ту же последовательность символов, что и этот объект.
Почему equals () не возвращает значение, как описано и продемонстрировано выше? Странно, compareTo () возвращает 0!