`##`和`hashCode`有什么区别?

0__*_*0__ 37 scala hashcode

方法##和有hashCode什么区别?

无论hashCode我使用哪个类或重载,它们似乎都输出相同的值.谷歌也没有帮助,因为它找不到符号##.

oxb*_*kes 37

从散列角度看,"子类"的AnyVal行为不正常:

scala> 1.0.hashCode
res14: Int = 1072693248
Run Code Online (Sandbox Code Playgroud)

当然这是打电话给:

scala> new java.lang.Double(1.0).hashCode
res16: Int = 1072693248
Run Code Online (Sandbox Code Playgroud)

我们可能更喜欢它:

scala> new java.lang.Double(1.0).##
res17: Int = 1

scala> 1.0.##
res15: Int = 1
Run Code Online (Sandbox Code Playgroud)

鉴于int1也是1 ,我们应该期待这一点double.当然,Java中不会出现这个问题.没有它,我们就会遇到这个问题:

Set(1.0) contains 1 //compiles but is false
Run Code Online (Sandbox Code Playgroud)

幸运的是:

scala> Set(1.0) contains 1
res21: Boolean = true
Run Code Online (Sandbox Code Playgroud)


Jes*_*erg 32

##之所以被介绍是因为hashCode==Scala中的运算符不一致.如果a == b那么a.## == b.##无论a和b的类型如何(如果自定义hashCode实现是正确的).同样是没有真正hashCode的可以由其他海报给出的例子可以看出.


小智 5

只想添加其他海报的答案,虽然##方法努力保持相等和哈希码之间的契约,但在某些情况下显然不够好,比如当你比较双打和长号时(scala 2.10.2) ):

> import java.lang._
import java.lang._

> val lng = Integer.MAX_VALUE.toLong + 1
lng: Long = 2147483648

> val dbl = Integer.MAX_VALUE.toDouble + 1
dbl: Double = 2.147483648E9

> lng == dbl
res65: Boolean = true

> lng.## == dbl.##
res66: Boolean = false

> (lng.##, lng.hashCode)
res67: (Int, Int) = (-2147483647,-2147483648)

> (dbl.##, dbl.hashCode)
res68: (Int, Int) = (-2147483648,1105199104)
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚在 Scala 2.11.7 中检查了这个,并没有看到 `==` 和 `.## == .##` 的相同行为 (2认同)