为什么a是对的呀不应该满足底层数组长度大于64吗

下面关于哈希表特点描述错误的是?()
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);
                // 冲突的节点达到8if (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个条件

  1. 当冲突节点达到8个
  2. hashmap长度达到64

因此,单说“在jdk8之后,当链表长度超过阈值(8)时,将链表转换为红黑树”,是不严谨的说法。也可以看出出题人其实并不是很了解hashmap的底层原理,或者说出题人觉得,条件说一半也可以是正确的。没必要太去纠结题目,毕竟题目有时候也会是错误的。

可能只能用排除法吧,D很明显,哈希表的查询效率和数组基本一样。