我'很好奇,如果hashCode()函数在Scala中返回的lambda或其他内容总是相同的值?
我的测试向我展示了一些静态值,即使在构建上也不会改变。这是预期的行为还是将来会发生变化?
如果这是一些静态行为,它将帮助我构建我的库。
修改
让我们来看看这个源代码:
object Main {
def main(args: Array[String]): Unit = {
val x = (s: String) => 1
val y = (s: String) => 2
println(x.hashCode())
println(y.hashCode())
}
}
它在控制台上的输出总是1792393294
和226170135
。
我目前正在做的是实现一个我用多种语言实现的解析器组合库。我需要知道包装类是否相同(例如底层函数是相同的)所以我可以实现像调用堆栈这样的东西,我需要在失败时尽可能地解析,但防止错误的无限递归。
提前致谢!
答案 0 :(得分:5)
hashCode
的默认实现(至少在Oracle JVM中)是根据该特定对象的(初始)内存地址。因此,如果你的程序在构造该对象之前以完全相同的顺序构造了完全相同大小的对象,那么它实际上每次都会返回相同的值。
但这根本不可靠;大多数程序在每次运行时都不会做同样的事情。一旦你做了回应用户输入之类的事情,那么完美的再现性就会消失 - 例如也许你有时会为HashMap
添加足够的条目以触发表格的放大,有时则不会。如果你稍后在程序中构造相同的值,它当然会有不同的地址;尝试做
val z = (s: String) => 1
并观察它与hashCode
的{{1}}不同。更不用说不同JVM,同一JVM的不同版本,或者使用不同x
设置启动相同JVM时,数字可能会有所不同。
计算机在实践中通常比在理论上更具确定性。但这并不是指定要发生的事情,当然也不是你的程序可以依赖的东西。