在Java中,Hashtable在内部使用哪种解析技术?

时间:2018-10-19 06:39:16

标签: java hashtable

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

有人可以告诉我哈希表在内部使用哪种技术吗?

1 个答案:

答案 0 :(得分:0)

如果您查看源代码(有一些在线资源,或者JDK的src.jar目录中有src.ziplib,那么我认为JDK 11+只是在OpenJDK(不是Oracle的OpenJDK)中,您可以看到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;
}

我们可以看到键的hashCode用于选择存储桶,然后在该存储桶中进行线性搜索以查找条目。


请注意,Hashtable在很大程度上是一个遗留类,从Java 1.2开始由HashMap取代。 OpenJDK的HashMap最初的工作方式与Hashtable相似,但是如果存储桶过大,它将转而使用包含类似TreeMap的结构的存储桶(它们看起来更快一些)桶满的时候向上移动。