下面关于哈希表特点描述错误的是?()
A、 在jdk8之后,当链表长度超过阈值(8)时,将链表转换为红黑树
B、同一hash值的元素都存储在一个链表里
C、jdk8后哈希表存储采用数组+链表+红黑树实现
D、 哈希表查询数据的效率较慢
【参考答案】: D
【您的答案】: A
这种问题看下源码就知道了,光靠猜,或者听别人说可能都不是正确的。
// put 中的部分实现
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
// 冲突的节点达到8个
if (binCount >= TREEIFY_THRESHOLD - 1)
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
// treeifyBin部分实现
// 判断map长度,小于64则直接扩容
if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
resize();
// 将冲突的转为红黑树
else if ((e = tab[index = (n - 1) & hash]) != null) {
TreeNode<K,V> hd = null, tl = null;
do {
TreeNode<K,V> p = replacementTreeNode(e, null);
if (tl == null)
hd = p;
else {
p.prev = tl;
tl.next = p;
}
tl = p;
} while ((e = e.next) != null);
if ((tab[index] = hd) != null)
hd.treeify(tab);
}
综上所述,转红黑树需要满足2个条件
因此,单说“在jdk8之后,当链表长度超过阈值(8)时,将链表转换为红黑树”,是不严谨的说法。也可以看出出题人其实并不是很了解hashmap的底层原理,或者说出题人觉得,条件说一半也可以是正确的。没必要太去纠结题目,毕竟题目有时候也会是错误的。
可能只能用排除法吧,D很明显,哈希表的查询效率和数组基本一样。