HashMap采用数组+链表/红黑树结构,通过hashCode()计算索引,(n-1)&hash快速寻址;默认容量16、负载因子0.75,超阈值扩容并rehash;链表长度≥8且数组≥64时转红黑树优化查找。

HashMap在Java中通过数组加链表(或红黑树)的组合结构存储数据,核心是哈希表实现:先根据键的hashCode()计算索引位置,再处理哈希冲突。
HashMap内部维护一个Node<k>[] table</k>数组,每个元素是单向链表的头节点(JDK 8起可能是链表或红黑树)。数组长度总是2的幂次(如16、32、64),便于用位运算快速取模:(n - 1) & hash代替hash % n,提升效率。
capacity × loadFactor(即12)时触发扩容每个键值对被包装成Node对象,包含四个字段:hash(预存的哈希值)、key、value、next(指向下一个Node的引用)。这个设计避免重复调用key.hashCode(),也支持链表连接。
hashCode()相同且equals()返回true,新值会覆盖旧值hashCode()相同但equals()为false,则以链表形式存在同一数组槽位当某个数组位置上的链表长度达到8,且当前数组长度≥64时,该链表会转换为红黑树,目的是优化最坏情况下的查找性能(从O(n)降到O(log n))。若后续删除导致节点数≤6,则退化回链表。
立即学习“Java免费学习笔记(深入)”;
TreeNode,继承自Node,额外包含父、子、颜色等字段调用put(K key, V value)时,实际执行逻辑如下:
(n-1) & hash定位数组下标equals()比对key,存在则替换value;否则新增节点基本上就这些。理解Node数组、哈希寻址、冲突处理这三层,就能看懂HashMap怎么存数据了。
以上就是HashMap在Java中是如何存储数据的_Java中HashMap存储结构解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号