您知道,在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
我的问题是什么时候我们想要获得这些哈希码?它仅用于相等性检查还是具有除相等性检查之外的其他目的?
答案 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中的指针”-> 不,哈希码不是唯一的!