Java Hashtable是如何根据hashcode计算元素放置位置的?

How does Java Hashtable calculate where to place an element based on hashcode?

在Java中,Hashtable有数量等于其容量的桶。现在它如何确定它必须将对象存储在特定的桶中?我知道它使用对象的哈希码,但哈希码是一个奇怪的长字符串,哈希表对哈希码做了什么以确定入口位置?

对于 jdk7 的行为,请参阅:

https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/Hashtable.java#L358

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 内部类型名称组成的字符串。)

那么 HashMapHashTable(以及 HashSetLinkedHashMap)实际做的是:

  • 调用hashCode()获取32位整数,
  • 对整数执行一些特定于实现的修改1
  • 通过删除符号位将损坏的整数转换为非负整数,
  • 计算一个数组索引(对于桶)为value % array.length,其中array是散列table的当前散列链(或树)数组。

1 - HashMap / HashTable 的某些实现执行一些简单/廉价的按位处理。目的是在hashcode值低几位分布不均匀的情况下减少聚类。