我知道有一种哈希技术应用于密钥以将其值存储在内存地址中。
但我不明白碰撞是如何发生的? Java使用哪种哈希算法来创建内存空间?是MD5吗?
答案 0 :(得分:28)
HashMap
的基本理念是:
HashMap
实际上是一组包含Key和Value的特殊对象。hashCode()
方法提供。因此,在编写新的Class
时,您应该注意正确的hashCode()
和equals()
方法实现。默认值(Object
类)将内存指针作为数字。但这对我们想要使用的大多数类都不好。例如,String
类使用一种算法来生成字符串中所有字符的哈希值 - 想象如下:hashCode = 1.char + 2.char + 3.char...
(简化)。因此,两个相等的字符串,即使它们位于内存中的不同位置,也具有相同的hashCode()
。hashCode()
的结果,比如说“132”,那么如果我们有一个大的数组,那么应该存储对象的存储桶数量。但我们没有,我们的只有16桶。因此,我们使用明显的计算'hashcode % array.length = bucket'
或'132 mod 16 = 4'
,并将键值对存储在4号桶中。HashMap
上最昂贵的操作,所以如果你以前知道它,你想告诉你Maps
你将使用多少桶。 An image, courtesy of Wikipedia:
在这种情况下,
mod 256
后,指向数组中的四个不同的插槽。现在,如果您试图查找Sandra Dee的电话号码,您可以将她的名字哈希,将其修改为256,然后查看存储桶152.在那里您可以找到John Smith。那不是桑德拉,再看看......啊哈,桑德拉在约翰之后被锁住了。
答案 1 :(得分:3)
答案 2 :(得分:1)
作为hashCode()
类中的默认实现Object
函数,返回内存地址作为在HashTable
&中用作键的哈希值。 HashMap
。
答案 3 :(得分:0)
经过@Slanec的回答后,确实看到了Java-8中的javadoc,因为有重大变化。例如:'TREEIFY',其中LinkedList转换为TreeMap,以防达到每个桶的阈值条目数(当前为8)。