阅读帖子后,我对Java Hashtable感到困惑,它在内部使用单独的链接或链表或打开关闭地址来处理哈希表冲突。
有人可以告诉我哈希表在内部使用哪种技术吗?
答案 0 :(得分:0)
如果您查看源代码(有一些在线资源,或者JDK的src.jar
目录中有src.zip
或lib
,那么我认为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
的结构的存储桶(它们看起来更快一些)桶满的时候向上移动。