哈希表 (Hash Table)
哈希表是一种数据结构,它通过哈希函数,能将任意'键'(Key)瞬间映射到一个'存储地址',从而实现极速的数据访问。在 Java 中,我们最常用的哈希表实现是 HashSet 和 HashMap。
- HashSet:一个'不重复的登记簿',只关心东西在不在。
- HashMap:一个'万能的键对值档案柜',能根据标签(Key)快速找到内容(Value)。
场景及优势
| 核心用法 (适用场景) | 哈希表 (HashSet, HashMap) | 其他挑战者 (ArrayList, TreeSet 等) |
|---|---|---|
| 存在性检查 (在或不在?) | O(1) - 最快 | O(N) 或 O(log N) |
| 键值对存取 (根据 Key 找 Value) | O(1) - 最快 | O(N) 或 O(log N) |
| 数据去重 | O(N) - T0 级别 (遍历一次全放进去) | O(N log N) (先排序再去重) |
缺点
- 无序性:它不记顺序。如果你想找'分数在 80 到 90 之间的所有学生',哈希表会直接罢工。
- 空间消耗:为了保证速度,它通常会占用比实际数据更多的内存。竞赛场景中通常愿意用空间换取速度。
基础语法
一、HashMap 详解
HashMap 是一个实现了 Map 接口的类,用于存储键值对。
核心特点:
- 存储结构:存储键值对 (key-value)。
- 唯一性:键 (Key) 是唯一的,不重复。
- null 值:允许一个 null 键和多个 null 值。
- 顺序:无序的,不保证元素的存取顺序。
- 线程安全:非线程安全。
1. 组成结构
HashMap 的底层是一个'数组 + 链表 + 红黑树'的结构。
- 数组:主体部分,每个元素称为一个'桶 (bucket)'。
- 链表:当多个元素的哈希值相同(哈希冲突)时,它们会以链表的形式存储在同一个桶中。
- 红黑树:当某个桶中的链表长度过长(默认为 8)且数组容量足够大(默认为 64)时,链表会转换为红黑树以提高查询效率。
2. 基础语法与代码示例
首先,需要导入包:
import java.util.HashMap;
import java.util.Map;

