当前位置: 首页 > news >正文

HashMap 底层原理(面试精简版)

HashMap 底层原理(面试精简版)

1. 底层数据结构

  • JDK 1.7:数组 + 链表
  • JDK 1.8+:数组 + 链表 + 红黑树
    • 链表长度 > 8 且数组长度 ≥ 64 时,链表转为红黑树
    • 红黑树节点数 < 6 时,退化为链表

2. 核心常量

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 默认初始容量 16
static final float DEFAULT_LOAD_FACTOR = 0.75f;     // 默认负载因子
static final int TREEIFY_THRESHOLD = 8;             // 树化阈值
static final int UNTREEIFY_THRESHOLD = 6;           // 链化阈值
static final int MIN_TREEIFY_CAPACITY = 64;         // 最小树化容量

3. Put 流程(JDK 1.8)

  1. 计算 hash(key)(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)(扰动函数,高低位异或)
  2. 若数组为空,触发 resize() 初始化
  3. 计算索引:(n - 1) & hash,若该位置为空,直接插入
  4. 若不为空:
    • 检查 key 是否相等,相等则覆盖
    • 若为红黑树节点,调用 putTreeVal
    • 若为链表,遍历到尾插(JDK 1.7 头插,1.8 改为尾插),同时计数,超过 8 则转红黑树
  5. 插入后判断 size > threshold,是则扩容

4. 扩容机制

  • 触发条件size >= thresholdthreshold = capacity * loadFactor
  • 扩容大小:新容量 = 旧容量 << 1(翻倍)
  • 重哈希:节点重新计算索引,JDK 1.8 优化:
    • 节点在原位置或 原位置 + 旧容量,通过 (e.hash & oldCap) == 0 判断
    • 无需重新计算 hash,减少开销

5. 线程安全性

  • HashMap 非线程安全
  • 并发场景下可能产生:
    • JDK 1.7 头插法导致死循环(多线程扩容时)
    • 数据丢失、size 不准确
  • 替代方案:ConcurrentHashMapCollections.synchronizedMap

6. 关键知识点

问题 答案
为什么容量是 2 的幂 方便取模运算 (n - 1) & hash,保证均匀分布
负载因子为什么 0.75 时间与空间平衡的折中
为什么引入红黑树 防止链表过长导致查询 O(n) 退化为 O(log n)
null key 存在位置 固定存放在数组 0 号桶

7. JDK 1.7 vs 1.8 区别

对比项 JDK 1.7 JDK 1.8
数据结构 数组 + 链表 数组 + 链表 + 红黑树
插入方式 头插法 尾插法
扩容重哈希 重新计算每个 hash 优化为原位置或原位置+旧容量
扰动函数 多次异或 一次异或(高16位与低16位异或)

面试常问:“HashMap 的 get 流程?” → 计算 hash → 定位桶 → 遍历链表/红黑树,用 equals() 比较 key 返回 value。

http://www.jsqmd.com/news/550549/

相关文章:

  • 从图像压缩到推荐系统:深入浅出聊聊SVD分解到底在干嘛
  • 机械性能拉压试验机的设计毕业设计(任务书+论文+CAD图纸+三维图+中英文翻译文献)
  • PDFMathTranslate深度解析:基于ONNX推理引擎的学术论文翻译技术评测
  • 页面有hover效果冻结元素
  • 2026年澳洲雇主担保移民攻略:上海地区优质服务商选择指南 - 见闻解构
  • PFC5.03D三轴流固耦合仿真:压力卸除下的网格分析
  • SLAM3R:单目RGB实时稠密重建新标杆,20+FPS下的精度与效率双突破
  • 零基础也能玩转!LiuJuan Z-Image Generator保姆级离线安装教程
  • 普通信息素蒸发
  • Charticulator:重构数据可视化创作范式的技术革命
  • 2026年废液焚烧炉企业哪家好,高盐废液焚烧炉/含盐废液焚烧炉/高温焚烧炉/蓄热式有机废气焚烧炉,废液焚烧炉原理怎么选择 - 品牌推荐师
  • BilibiliDown:专业B站Hi-Res音频下载工具全攻略
  • SQL Server CDC实战指南:用Debezium+SpringBoot构建实时数据管道(含性能调优建议)
  • 手机越用越卡?Universal Android Debloater让Android设备重获新生
  • 5分钟零代码制作专业视频:Auto-Video-Generator完整使用指南
  • SAP PP工艺路线Routing保姆级配置指南:从CA01创建到工序指派,手把手教你搞定生产流程
  • 3步打造你的专属黑苹果配置:面向技术爱好者的OpenCore工具应用指南
  • ESP32直流电机驱动库:L293D与Satima芯片轻量控制方案
  • 29 中望CAD二次开发(ZRX C++)-Overrule
  • 一站式员工福利平台靠谱选型:技术落地逻辑与核心要点拆解
  • 5分钟上手Python股票数据接口:MOOTDX让金融分析如此简单
  • 效率提升秘籍:基于快马AI生成自动化脚本,十分钟搞定百个页面每日巡检
  • 牛行为识别数据集(5000张图片已划分、已标注)AI训练适用于目标检测任务
  • 为什么Ag比grep快10倍?深入解析Ag搜索工具的性能优化技巧
  • 3步搞定Obsidian图片本地化:Local Images Plus插件终极指南
  • QuickRecorder:让macOS屏幕录制变得简单又高效 [特殊字符]
  • Umi-OCR:免费开源的文字识别解决方案,让图片中的文字“开口说话“
  • ResNet18镜像实战:智能相册自动打标、教育辅助、游戏截图分析全解析
  • 别再只用Polyline了!用Cesium自定义材质打造酷炫的动态箭头/脉冲线效果
  • 2026长沙网络推广公司实测|本地精准引流不踩坑,真实选型指南 - 亿仁imc