Scala “hashCode”和“hashCode”有什么区别?
方法Scala “hashCode”和“hashCode”有什么区别?,scala,hashcode,Scala,Hashcode,方法#和hashCode之间有什么区别 无论我使用哪个类或hashCode重载,它们似乎都输出相同的值。谷歌也没有帮助,因为它找不到符号##,AnyVal的“子类”从哈希角度看行为不正常: scala> 1.0.hashCode res14: Int = 1072693248 当然,这是一个打电话给: scala> new java.lang.Double(1.0).hashCode res16: Int = 1072693248 我们可能希望它是: scala> new
#
和hashCode
之间有什么区别
无论我使用哪个类或hashCode
重载,它们似乎都输出相同的值。谷歌也没有帮助,因为它找不到符号##
,AnyVal
的“子类”从哈希角度看行为不正常:
scala> 1.0.hashCode
res14: Int = 1072693248
当然,这是一个打电话给:
scala> new java.lang.Double(1.0).hashCode
res16: Int = 1072693248
我们可能希望它是:
scala> new java.lang.Double(1.0).##
res17: Int = 1
scala> 1.0.##
res15: Int = 1
考虑到int
1也是double
1,我们应该预料到这一点。当然,这个问题在Java中不会出现。如果没有它,我们会有这个问题:
Set(1.0) contains 1 //compiles but is false
幸运的是:
scala> Set(1.0) contains 1
res21: Boolean = true
之所以引入
##
,是因为hashCode
与Scala中的=
运算符不一致。如果a==b
则a.###==b.##
而不管a和b的类型(如果自定义hashCode
实现正确)。从其他海报的例子中可以看出,hashCode
的情况并非如此。只是想补充一下其他海报的答案,即尽管##方法努力保持相等和哈希代码之间的契约,但在某些情况下,它显然不够好,比如在比较双精度和长精度时(scala 2.10.2):
除了大家所说的之外,我想说
###
是空安全的,因为null.##
返回0
,而null.hashCode
抛出NullPointerException
来自scaladoc:
与x.hashCode等效,但盒装数字类型和null除外。对于数字,它返回与值相等的哈希值:如果两个值类型实例比较为true,则##将为每个实例生成相同的哈希值。对于null,它返回一个哈希代码,其中null.hashCode抛出NullPointerException
1.0 hashCode
v1.0##
v1 hashCode
v1###
-有点离题,但是你可以使用搜索这样的符号。啊,好的。所以,1.hashCode
=/code>1.\code>和1.2.hashCode
!=
1.0.##
(因此###
更适合于比较数字)“与x.hashCode等效,但盒装数字类型除外。对于数字,它返回一个与值相等的哈希值:如果两个值类型实例比较为true,则##将为每个实例生成相同的哈希值。”。“@om-nom-nom,有点像主题,但谢谢你的提示。太棒了!真的吗?这是一个bug吗?这显然是根据scaladoc for###”…它返回一个与值相等的哈希值:如果两个值类型实例比较为true,那么##将为它们中的每一个生成相同的哈希值…”我刚刚在scala 2.11.7中检查了这一点,但没有看到=
和.##
具有相同的行为。因此,当为特定类同时实现equals
和hashCode
时,我不确定这如何转化为最佳策略。我假设hashCode
实现应该使用
。但是,equals
实现应该使用hashCode
还是##
?下面是我在另一个线程上提供的答案,该线程假设equals
实现应该使用hashCode
,而hashCode
实现应该使用###
。对此进行评估和反馈非常感谢。因此,当为特定类实现equals
和hashCode
时,我不确定这如何转化为最佳策略。我假设hashCode
实现应该使用#
。但是equals
实现应该使用hashCode
吗r##
?下面是我在另一个线程上提供的答案,该线程假设等于实现应该使用hashCode
,而hashCode
实现应该使用#
。对此的评估和反馈将不胜感激。
> 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)