【发布时间】:2013-09-26 14:04:04
【问题描述】:
最近,我在我们的代码库中处理一个错误,我发现通过 String 在 HashMap 中查找一个值会产生正确的结果,而使用“${key}”通过 GStringImpl 查找一个值会产生不正确的 (null ) 结果。以下是我在 Groovy 控制台中做的一个测试:
def myMap = ["testString" : "value"]
def testString = "testString"
println myMap.get("${testString}")
println myMap[testString]
println "${testString}".getClass()
println testString.getClass()
String myString = "test"
def myGroovyString = "${myString}"
println myString.equals(myGroovyString)
println myString.hashCode()
println myGroovyString.hashCode()
println myString.compareTo(myGroovyString)
产生的输出如下:
null
value
class org.codehaus.groovy.runtime.GStringImpl
class java.lang.String
false
3556498
3556535
0
现在,如果我将地图的定义更改为 TreeMap 的实现,如下所示:
def myMap = ["testString" : "value"] as TreeMap
我得到以下结果:
value
value
class org.codehaus.groovy.runtime.GStringImpl
class java.lang.String
false
3556498
3556535
0
我知道发生这种情况的原因可能是因为(我没有查看 HashMap 与 TreeMap 的实现)HashMap 通过 hashCode() 查找键,而 TreeMap 将使用 compareTo(...)。我的问题是为什么 String 和 GStringImpl 不产生相同的 hashCode() 并且在使用 equals(...) 时不产生真实的结果?这是错误/设计错误吗?或者这样做是有原因的?看起来这些方法的结果应该是兼容的,因为这些类之间的交互对程序员来说应该是无缝的。这样做的结果是代码中可能出现巨大的错误,这些错误乍一看似乎很直观,但会导致地图查找出现错误。
谢谢,
克里斯
【问题讨论】: