我知道有一种散列技术应用于键以将其值存储在内存地址中。
但我不明白这里的碰撞是如何发生的?Java 使用哪种散列算法来创建内存空间?是MD5吗?
的基本思想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
将使用多少个存储桶。在这种情况下,
mod 256
,指向数组中的四个不同的插槽。现在,如果您尝试查找 Sandra Dee 的电话号码,您将散列她的姓名,将其修改为 256,然后查看存储桶 152。在那里您会找到 John Smith。那不是 Sandra,再看远点……啊哈,Sandra 被锁在 John 身后。
作为类中的默认实现 hashCode()
函数,Object
将内存地址作为哈希值返回,用作HashTable
&中的键HashMap
。
经过@Slanec 的回答后,请查看 Java-8 中的 javadoc,因为有重大变化。例如:“TREEIFY”,其中 LinkedList 被转换为 TreeMap,以防达到每个桶的条目数阈值(当前为 8)。