一、核心结论
HashMap 是 Java 集合框架中最常用的 键值对(Key-Value)存储容器,基于「哈希表」实现,核心特点是:无序存储、键唯一(值可重复)、查询 / 增删效率高(平均时间复杂度 O (1)),是 Android 开发中存储配置、缓存数据、传递参数的首选。
本文从「底层原理、核心用法、常见问题、Android 实战」四个维度拆解,新手能看懂,同时覆盖面试高频考点。
二、HashMap 核心原理(通俗版)
1. 底层结构:数组 + 链表 / 红黑树(JDK 1.8+)
HashMap 的底层像一个「数组柜子」,每个柜子(数组索引)里可能挂着「链表」,当链表长度超过阈值(默认 8),会自动转成「红黑树」—— 这是为了平衡「数组查询快」和「链表增删快」的优点,解决哈希冲突。
核心概念拆解:
| 数组(桶) | 基础存储结构,通过哈希值计算索引,快速定位元素 | 初始化 HashMap 即创建 |
| 链表 | 解决「哈希冲突」(不同 Key 计算出相同索引),挂在数组索引下 | 索引冲突且链表长度 < 8 |
| 红黑树 | 当链表过长时(>8),转红黑树提升查询效率(O (n)→O (logn)) | 链表长度 ≥8 且数组长度 ≥64 |
2. 核心流程:存值(put)& 取值(get)
(1)存值(put)流程(通俗版):
- 无冲突:直接把 Key-Value 放在该索引位置;
- 有冲突:判断 Key 是否相同(equals 比较):
- Key 相同:覆盖旧 Value;
- Key 不同:挂到链表末尾(或红黑树);
(2)取值(get)流程(通俗版):
- 索引位置是单个元素:直接返回 Value;
- 索引位置是链表 / 红黑树:遍历 / 查找匹配的 Key,返回对应的 Value;
- 无匹配 Key:返回 null。
3. 关键参数(新手必知)
| 初始容量 | 16 | 数组的初始长度(必须是 2 的幂,如 16、32、64,方便计算索引) |
| 负载因子 | 0.75 | 扩容阈值比例:当元素数 ≥ 数组长度 × 0.75 时,触发扩容(平衡空间和效率) |
| 链表转红黑树 | 8 | 单个索引下链表长度 ≥8 时,转红黑树 |
| 红黑树转链表 | 6 | 扩容 / 删除元素后,红黑树节点数 ≤6 时,转回链表 |



