HashMap

核心原理及常见问题

底层数据结构

JDK7的底层数据结构是数据+链表

JDK8的底层数据结构是数组+链表+红黑树

  • 链表的冲突解决方法:拉链法
  • 引入红黑树的原因:链表查询的时间复杂度事O(n),红黑树查询的时间复杂度事O(logn),当链表长度较长时,查询效率低,引入红黑树可以提高查询效率

扩容机制

  • 默认的初始容量时16,加载因子时0.75,当元素个数>=阈值(容量*加载因子)的时候,就会触发扩容机制
  • 扩容机制:容量扩大为原来的两倍,并且重新计算每个元素的位置,将原数据迁移到新数组
  • put方法的执行流程:
  1. 检查数组是否为空,为空则初始化(扩容);

  2. 计算 key 的哈希值(hash = key.hashCode() ^ (hash >>> 16)),通过 (n-1) & hash 定位数组下标;

  3. 若下标位置无元素,直接新建节点放入;

  4. 若下标位置有元素:

  • 若节点 key 与传入 key 相等(equals 且 hashCode 相等),覆盖 value;

  • 若节点是红黑树节点,调用红黑树插入方法;

  • 若节点是链表节点,遍历链表:

  • 找到相等 key 则覆盖 value;

  • 未找到则尾插法插入新节点,插入后检查链表长度是否 ≥8,若满足则尝试转红黑树;

  1. 插入后检查元素个数是否 ≥ 扩容阈值,若是则触发扩容。
相关推荐
Wang's Blog2 分钟前
Java 项目实战: 交友项目 - 黑名单:取消黑名单
java·windows·交友
杨杨杨大侠31 分钟前
DeepSeek Harness:连 Agent Loop 都能替换的插件架构
java·人工智能·agent
SL_staff31 分钟前
私有化低代码运维三重雷区:JVS开源栈中的Kafka/ES/RabbitMQ治理实践
java·低代码·全栈
yuniko-n32 分钟前
【算法】约瑟夫环问题
java·算法
郝亚军42 分钟前
manifest 中 `sha256` 与 `signValue` 的作用
java·开发语言·数据结构
譕痕1 小时前
stripe 实例
java·开发语言·stripe·checksession
墨子夕1 小时前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(前言篇)
java·开发语言·设计模式
骇客野人1 小时前
Linux 全套实操方案(含目录详解、文件传输、日志、文件规范、环境变量、Java 应用部署运维)
java·linux·运维
.Bryce.1 小时前
MCP+A2A+ANP,Agent通信协议的完整知识地图
java·人工智能·后端·agent·通信协议
SL_staff2 小时前
规则引擎选型陷阱:为什么QPS不是JVS-Rules对比Drools的核心指标
java·开源·全栈