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)