Scala:使用表达式或类实例的哈希代码背后的原因是什么?
正如您所知,在Scala中,可以使用Scala:使用表达式或类实例的哈希代码背后的原因是什么?,scala,hashcode,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 = 98
##
以空安全的方式获取某个内容的哈希代码:
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
我的问题是我们什么时候想要得到这些散列码?它只用于相等性检查,还是除了相等性检查之外还有其他用途?我认为这与JAVA非常相似,JAVA需要给出hashcode,以便检查集合项的相等性,其中元素的唯一性是根据
equals()
和hashcode()计算的
方法。例如,对于HashMap中的对象
这里记录了这一点:
这也是Martin Odersky在“Scala编程”中所写的,他在其中展示了:
val p1, p2 = new Point(1,2)
collection.mutable.HashSet(p1) contains p2
// MAY return false
这可能返回false,因为没有给出Point的hashCode
方法,但结果不是100%确定的。原因:contains
方法首先尝试确定要查找的哈希桶,然后将给定元素与该桶中的所有元素进行比较
*编辑:您说过:“我知道我们可以使用哈希代码检查两个对象是否相等,但这是唯一的原因吗?”但如果两个对象共享相同的哈希代码,这并不会使它们自动相等。如果它们相等,则它们必须具有相同的哈希代码,但不相等的对象也可能具有相同的哈希标记
“哈希代码的使用与C中的指针类似”->
不,哈希代码不是唯一的 你是说散列码而不是散列标签?请对此进行更多解释“但如果两个对象共享相同的哈希标记,这并不意味着它们自动相等。如果它们相等,它们必须具有相同的哈希标记”是的,当然。编辑。也许你应该通读一下散列函数。哈希函数是可以用来将任意大小的数据映射到固定大小的数据的任何函数(Wikipedia)。例如,
HashMap
s中使用这些选项可以更高效地浏览它们。如果在哈希映射xmap
中搜索元素x
,而不是浏览所有对象并检查相等性,则首先在x上调用hashfunction以生成hashcode。然后我们可以直接在xmap
中的“bucket”中搜索,该bucket包含具有相同hashcode的所有元素,这使得搜索更加高效。