Java Hashtable是如何根据hashcode计算元素放置位置的?
How does Java Hashtable calculate where to place an element based on hashcode?
在Java中,Hashtable有数量等于其容量的桶。现在它如何确定它必须将对象存储在特定的桶中?我知道它使用对象的哈希码,但哈希码是一个奇怪的长字符串,哈希表对哈希码做了什么以确定入口位置?
对于 jdk7 的行为,请参阅:
int index = (hash & 0x7FFFFFFF) % tab.length;
这是哈希 table 的常用技术。第一位被丢弃(使值为正)。索引是 remainder 除以 table 大小。
依赖于实现(例如,如果你依赖它以这种方式工作,你的代码就会被破坏;HashMap 保证的东西在它的 javadoc 中有详细说明,none 我将要类型在那里):
哈希只是一个数字。在大约-20亿到+20亿之间。您看到的'long weird string'只是一种更方便的展示给您的方式。
首先将该数的高位混入低位(实际上是高位异或到低位):12340005变成12341239。
然后,这个数除以当前有多少个buckets,但是结果被扔掉了,就是我们感兴趣的余数。这个余数一定是0或者更高,并且永远不会超过'# of buckets有',所以总是准确地指向其中一个桶。
这是对象进入的桶。
如果桶变得太大,则会调整大小。
关于更多信息,好吧,HashMap 和 HashSet 都是开源的 - 看看就好。
I know it uses hashcode of the object but hashcode is a weird long string, what does hashtable do to the hashcode to determine place of entry?
哈希码不是“奇怪的长字符串”。它是一个 32 位有符号整数。
(我认为您混淆了哈希码和调用 Object::toString
时得到的内容......这是一个由哈希码和 Java 内部类型名称组成的字符串。)
那么 HashMap
和 HashTable
(以及 HashSet
和 LinkedHashMap
)实际做的是:
- 调用
hashCode()
获取32位整数,
- 对整数执行一些特定于实现的修改1,
- 通过删除符号位将损坏的整数转换为非负整数,
- 计算一个数组索引(对于桶)为
value % array.length
,其中array
是散列table的当前散列链(或树)数组。
1 - HashMap
/ HashTable
的某些实现执行一些简单/廉价的按位处理。目的是在hashcode值低几位分布不均匀的情况下减少聚类。
在Java中,Hashtable有数量等于其容量的桶。现在它如何确定它必须将对象存储在特定的桶中?我知道它使用对象的哈希码,但哈希码是一个奇怪的长字符串,哈希表对哈希码做了什么以确定入口位置?
对于 jdk7 的行为,请参阅:
int index = (hash & 0x7FFFFFFF) % tab.length;
这是哈希 table 的常用技术。第一位被丢弃(使值为正)。索引是 remainder 除以 table 大小。
依赖于实现(例如,如果你依赖它以这种方式工作,你的代码就会被破坏;HashMap 保证的东西在它的 javadoc 中有详细说明,none 我将要类型在那里):
哈希只是一个数字。在大约-20亿到+20亿之间。您看到的'long weird string'只是一种更方便的展示给您的方式。
首先将该数的高位混入低位(实际上是高位异或到低位):12340005变成12341239。
然后,这个数除以当前有多少个buckets,但是结果被扔掉了,就是我们感兴趣的余数。这个余数一定是0或者更高,并且永远不会超过'# of buckets有',所以总是准确地指向其中一个桶。
这是对象进入的桶。
如果桶变得太大,则会调整大小。
关于更多信息,好吧,HashMap 和 HashSet 都是开源的 - 看看就好。
I know it uses hashcode of the object but hashcode is a weird long string, what does hashtable do to the hashcode to determine place of entry?
哈希码不是“奇怪的长字符串”。它是一个 32 位有符号整数。
(我认为您混淆了哈希码和调用 Object::toString
时得到的内容......这是一个由哈希码和 Java 内部类型名称组成的字符串。)
那么 HashMap
和 HashTable
(以及 HashSet
和 LinkedHashMap
)实际做的是:
- 调用
hashCode()
获取32位整数, - 对整数执行一些特定于实现的修改1,
- 通过删除符号位将损坏的整数转换为非负整数,
- 计算一个数组索引(对于桶)为
value % array.length
,其中array
是散列table的当前散列链(或树)数组。
1 - HashMap
/ HashTable
的某些实现执行一些简单/廉价的按位处理。目的是在hashcode值低几位分布不均匀的情况下减少聚类。