Java 哈希表(HashMap)详解 + LeetCode 常用写法总结
·
Java 哈希表(HashMap)详解 + LeetCode 常用写法总结
前言
在刷 LeetCode 的过程中,我发现一个很现实的问题:哈希表思路会,但 Java 写法总是忘
比如:
put / get怎么写?- 怎么判断 key 存不存在?
- 怎么统计频率?
- 怎么一边遍历一边更新?
于是整理这篇文章,作为自己的哈希表语法速查 + 刷题模板总结。
一、什么是哈希表?
哈希表(Hash Table)是一种:
通过 key 快速找到 value 的数据结构
Java 中最常用的实现是:
HashMap<K, V>
特点:
- 查询快:平均 O(1)
- 无序
- key 不能重复
二、HashMap 基本用法
1. 创建
HashMap<Integer, Integer> map = new HashMap<>();
2. 添加 / 修改
map.put(1, 10); // key=1, value=10
map.put(1, 20); // 覆盖
3. 获取
int val = map.get(1);
注意:
map.get(100); // 不存在返回 null
刷题常见错误点!
4. 判断是否存在
map.containsKey(1);
5. 删除
map.remove(1);
三、刷题最常用的 3 个模板
模板 1:统计频率(出现次数)
高频题型:字符串 / 数组
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
核心:
getOrDefault(key, 默认值)
模板 2:判断是否存在(两数之和)
经典题:Two Sum
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int target = sum - nums[i];
if (map.containsKey(target)) {
return new int[]{map.get(target), i};
}
map.put(nums[i], i);
}
模板 3:一边遍历一边更新
常见:去重 / 记录状态
HashMap<Integer, Boolean> map = new HashMap<>();
for (int num : nums) {
if (!map.containsKey(num)) {
map.put(num, true);
}
}
四、遍历 HashMap
1. 遍历 key
for (Integer key : map.keySet()) {
System.out.println(key);
}
2. 遍历 value
for (Integer value : map.values()) {
System.out.println(value);
}
3. 遍历 key + value(推荐)
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
五、刷题常见坑
1. 空指针问题
map.get(key) + 1 // 可能报错
正确写法:
map.getOrDefault(key, 0) + 1
2. key 不存在
if (map.get(key) == null)
推荐:
map.containsKey(key)
3. 覆盖问题
map.put(key, value);
会覆盖旧值!
六、HashMap 在 LeetCode 中的作用总结
本质就是三件事:
- 查找是否存在(O(1))
- 统计频率
- 建立映射关系
七、一句话总结
哈希表 = 快速查找 + 空间换时间
更多推荐

所有评论(0)