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 中的作用总结

本质就是三件事:

  1. 查找是否存在(O(1))
  2. 统计频率
  3. 建立映射关系

七、一句话总结

哈希表 = 快速查找 + 空间换时间

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐