java - 查询HashMap内部实现
问题描述
我正在通过 HashMap 实现并参考此链接:Java 如何实现哈希表? 我发现“一个 HashMap 包含一个桶数组以包含其条目”。所以,我有几个问题-
- 桶数组的类型是什么。
- 由于数组有缺点(例如固定大小并且只允许同质数据)。那么尽管有这些缺点,我们为什么要使用数组。
3.如果键或冲突的哈希码相同,它使用链表。它如何获取(搜索)第二个,第三个节点的引用等。
谢谢你的建议。
解决方案
来自OpenJDK8 代码源:
- 垃圾箱是列表或树,具体取决于它们持有的元素数量
- 在这种情况下,数组的同质性不是问题,访问速度优先于调整数组大小的成本
- 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;
}
推荐阅读
- angular - 如何在 ngOnInit 中有条件地进行 http 调用
- r - 如何在ggplot中将内核添加到直方图中?
- c++ - 如何添加自定义关键字以在 clang 格式中被视为“类”?
- javascript - 如何将子 div 位置编号分配给子 div 内的标签
- python - 为什么 ColumnTransformer 在运行时不采用转换器参数?
- ubuntu - Nginx 错误:(13:权限被拒绝)在 /var/cache/nginx/proxy_temp/ 上读取上游时
- youtube - YouTube API 未列出频道中的所有视频
- vb.net - 在 RTF 中用新行替换逗号
- visual-studio - HDF5:构建 Fortran 库 (Windows)
- javascript - 在 JavaScript 中访问更新表单的元素