Scala:使用表达式或类实例的哈希码的原因是什么?

时间:2018-09-20 06:37:54

标签: scala hashcode

您知道,在Scala ##中,可以使用以空安全的方式获取某事物的哈希码:

scala> def hello : String = "hello"
hello: String

scala> hello.##
res1: Int = 3329

scala> class Cat{}
defined class Cat

scala> val c = new Cat
c: Cat = Cat@3a91d146

scala> c.##
res2: Int = 982634822

我的问题是什么时候我们想要获得这些哈希码?它仅用于相等性检查还是具有除相等性检查之外的其他目的?

1 个答案:

答案 0 :(得分:1)

我认为这与JAVA非常相似,在Java中需要给出哈希码以检查集合项是否相等,其中元素的唯一性是根据equals()hashCode()方法计算的。例如。用于HashMap中的对象。

在此处记录:java.lang.Object

马丁·奥德斯基(Martin Odersky)在《 Scala中的编程》中也写了这样的文字:

val p1, p2 = new Point(1,2)
collection.mutable.HashSet(p1) contains p2
// MAY return false

这可能会返回false,因为没有给出Point的hashCode方法,但是结果不是100%确定的。原因:contains方法首先尝试确定要查找的哈希存储桶,然后将给定元素与该存储桶中的所有元素进行比较。

* Edit:您说过:“我知道我们可以使用它们的哈希码检查两个对象的相等性,但这是唯一的原因吗?”但是,如果两个对象共享相同的哈希码,则不会使它们自动相等。如果它们相等,则它们必须具有相同的哈希码,但是不相等的对象也可以具有相同的哈希标记。

“哈希代码的用法类似于C中的指针”-> 不,哈希码不是唯一的!