Странное поведение сравнения строк в Groovy / Java

Рассмотрим следующий сценарий:

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!

7
задан Ted Hopp 13 June 2011 в 04:06
поделиться