【问题标题】:In java Hashtable uses which resolution technique internally?在 java Hashtable 内部使用哪种解析技术?
【发布时间】:2018-10-19 06:39:16
【问题描述】:

阅读帖子后,我对 java Hashtable 内部使用单独的链接或链接列表或打开关闭寻址来处理哈希表冲突感到困惑。

谁能告诉我哈希表在内部使用了哪种技术?

【问题讨论】:

  • 可以随时看源码; here's one copy I found with a quick search(不过是 JDK 7)。在 JDK 的 lib 目录中有一个 src.jarsrc.zip(仅适用于 v11+ 的 OpenJDK)。
  • 你为什么不直接在源代码中寻找自己?
  • 一般来说Hashtable是Java 1.2中被HashMap取代的遗留API。
  • @T.J. Crowder 谢谢,我发现一个bucket中存储了多个entry,必须按顺序搜索。这是否意味着它使用 Linked List ?我说对了吗?
  • @kavya - 每个桶都是单链表的桶,是的。

标签: java hashtable


【解决方案1】:

如果您查看源代码(有一些在线资源,或者在 JDK 的 lib 目录中有 src.jarsrc.zip — 我认为 JDK 11+ 仅在 OpenJDK 中,而不是 Oracle 的),可以看到Hashtable实现为一个桶数组,每个桶都是一个单链表。

数据存储在这里:

/**
 * The hash table data.
 */
private transient Entry<?,?>[] table;

那么如果我们看看get:

public synchronized V get(Object key) {
    Entry<?,?> tab[] = table;
    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;
    for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
        if ((e.hash == hash) && e.key.equals(key)) {
            return (V)e.value;
        }
    }
    return null;
}

我们可以看到key的hashCode是用来选择bucket的,然后在bucket中线性搜索entry。


请注意,Hashtable 在很大程度上是一个遗留类,在 Java 1.2 中被 HashMap 取代。 OpenJDK 的 HashMap 一开始的工作方式与 Hashtable 大致相同,但是如果存储桶变得太大,它会转而使用包含 TreeMap 类似结构的存储桶(当存储桶位于过满)。

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 2011-05-27
    • 2011-03-26
    • 2010-10-07
    • 2013-10-16
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多