首页 > 解决方案 > 查询HashMap内部实现

问题描述

我正在通过 HashMap 实现并参考此链接:Java 如何实现哈希表? 我发现“一个 HashMap 包含一个桶数组以包含其条目”。所以,我有几个问题-

  1. 桶数组的类型是什么。
  2. 由于数组有缺点(例如固定大小并且只允许同质数据)。那么尽管有这些缺点,我们为什么要使用数组。

3.如果键或冲突的哈希码相同,它使用链表。它如何获取(搜索)第二个,第三个节点的引用等。

谢谢你的建议。

标签: javahashmaphashtable

解决方案


来自OpenJDK8 代码源

  1. 垃圾箱是列表或树,具体取决于它们持有的元素数量
  2. 在这种情况下,数组的同质性不是问题,访问速度优先于调整数组大小的成本
  3. HashMap 总是遍历所有具有相同哈希的值,测试它们是否具有正确的键:
final Node<K,V> getNode(int hash, Object key) {
    Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
    if ((tab = table) != null && (n = tab.length) > 0 &&
        (first = tab[(n - 1) & hash]) != null) {
        if (first.hash == hash && // always check first node
            ((k = first.key) == key || (key != null && key.equals(k))))
            return first;
        if ((e = first.next) != null) {
            if (first instanceof TreeNode)
                return ((TreeNode<K,V>)first).getTreeNode(hash, key);
            do {
                if (e.hash == hash &&
                    ((k = e.key) == key || (key != null && key.equals(k))))
                    return e;
            } while ((e = e.next) != null);
        }
    }
    return null;

}

推荐阅读