Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala “hashCode”和“hashCode”有什么区别?_Scala_Hashcode - Fatal编程技术网

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
v
1.0##
v
1 hashCode
v
1###
-有点离题,但是你可以使用搜索这样的符号。啊,好的。所以,
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)