## 方法是在 Any 里定义的
注释里已经说了:Equivalent to x.hashCode except for boxed numeric types and null.
scala> null.##
res8: Int = 0
scala> null.hashCode // 空指针异常
java.lang.NullPointerException
对比浮点数的
scala> 1.0.hashCode // 等同于Double(1.0).hashCode
res11: Int = 1072693248
scala> 1.0.##
res12: Int = 1
scala> 1.1.## //小数部分不为零的,等同于其hashCode
res13: Int = -1503133693
scala> Set(1.0).contains(1) // 如果是java,将返回false
res24: Boolean = true
## 方法的引入,是因为 hashCode与==操作符的不一致的原因,如果 a==b
那么 a.## == b.##
不管a和b的类型(如果自定义hashCode实现正确)
// java里Double与Integer永远不可能equals为true
在java里,因为包装类的原因,虽然 1 == 1.0
为true,但将它们放入集合中时,分别boxing成为了Integer 和 Double;而 new Double(1).equals(1)
是false的,Double类型和Integer类型即使值相同equals也不相等,其hashCode也是不同的
// scala里Double与Int可以equals为true
但scala里 val i = 1; val d = 1D; i==d
是true,Int和Double类型只要其值一样就可以相等,而这时i与d的hashCode却是不同的;为了解决这个问题,引入了 ##
使得i.##
与 d.##
相同
相关谜题:一个相等性的puzzler
又长知识了。