Any.##方法与hashCode的区别

## 方法是在 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

Any.##方法与hashCode的区别》上有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注