跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
|注册
博客列表

目录

  1. HashSet
  2. HashMap
  3. TreeMap / TreeSet
  4. LinkedHashMap / LinkedHashSet
  5. 哈希在算法中的 10 大经典用法
  6. 判断元素是否存在
  7. 去重
  8. 统计频率
  9. 字符串计数(异位词)
  10. 两数之和(值 → 下标)
  11. 前缀和 + 哈希(子数组和为 k)
  12. 两数组交集
  13. 判断重复元素
  14. 分组(分类)
  15. 最近最少使用缓存(LRU)
  16. 数组哈希 vs Map 哈希
Javajava算法

Java 哈希数据结构与经典用法

本文介绍 Java 中哈希相关数据结构的核心用法。涵盖 HashSet 去重判断、HashMap 计数映射、TreeMap/Set 有序存储、LinkedHashMap/Set 保序存储。详细解析了哈希在算法中的十大经典场景,包括两数之和、前缀和、异位词统计、LRU 缓存等。同时对比了数组哈希与 Map 哈希的适用场景,帮助开发者根据 Key 范围选择合适方案,提升查找效率至 O(1)。

星星泡饭发布于 2026/3/29更新于 2026/4/131 浏览
Java 哈希数据结构与经典用法

哈希的本质是用空间换时间,把查找从 O(n) 降到 O(1) 平均。

HashSet

存不存在 / 去重,用于判断某元素是否出现过、数组去重、集合交集

Set<Integer> set = new HashSet<>();
set.add(3); // 添加元素
set.add(3); // 重复元素不会加入
set.contains(3); // 判断是否存在
set.remove(3); // 删除元素

典型题:两数之和、数组去重、判断重复元素、两数组交集

HashMap

计数 / 映射,用于字符统计、频率统计、值到索引映射

Map<Integer, Integer> map = new HashMap<>();
for (int n : nums) {
    // 如果 n 不存在,默认返回 0,然后 +1
    map.put(n, map.getOrDefault(n, 0) + 1);
}

两个 Integer 代表泛型,指 key 和 value 都是整数。map.put(n, map.getOrDefault(n, 0) + 1) 是哈希计数的经典写法,意思是给 n 做出现次数统计。map.getOrDefault(n, 0) 去 map 里取 n 的值,如果 n 不存在,就返回默认值 0。因为我们要统计出现次数,每遇到一次就加 1。map.put(n, ...) 代表把更新后的次数放回 map 里,如果 n 原来不存在,会自动创建。

典型题:字母异位词、出现次数最多的元素、前缀和 + 哈希、两数之和

TreeMap / TreeSet

有序哈希,用于需要自动排序、范围查询

Set<Integer> set = new TreeSet<>();
Map<Integer, Integer> map = new TreeMap<>();

基本用法:

TreeSet<Integer> set = new TreeSet<>();
set.add(5);
set.add(3);
set.add(8);
set.add(3); // 重复元素不会加入
System.out.println(set); // [3, 5, 8] 自动升序
TreeMap<Integer, String> map = new <>();
map.put(, );
map.put(, );
map.put(, );
map.put(, ); 
System.out.println(map); 
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • AirSim 无人机仿真入门:实现起飞与降落
  • 阿里推出 AI 编程插件 Qoder,JetBrains 集成体验一周评测
  • HOS-MAKE:AI 驱动的代码加密与混淆系统
  • AI 核心概念解析:从 LLM 到 Agent
  • 如何在Llama-Factory中自定义损失函数?高级用法指南
  • OpenClaw Windows 部署:Node.js 22+Git+Kimi+ 飞书
  • 低成本运行 Claude Code:通过 LiteLLM 接入 GitHub Copilot Chat API 的完整指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

TreeMap
3
"C"
1
"A"
2
"B"
2
"BB"
// key=2 更新 value
// {1=A, 2=BB, 3=C} 自动按 key 排序

LinkedHashMap / LinkedHashSet

保序哈希,用于保持插入顺序 + 哈希效率

Map<Integer, Integer> map = new LinkedHashMap<>();
Set<Integer> set = new LinkedHashSet<>();

基本用法:

Set<Integer> set = new LinkedHashSet<>();
set.add(3);
set.add(1);
set.add(5);
set.add(1); // 重复元素不会加入
System.out.println(set); // [3, 1, 5] 插入顺序保持
Map<Integer, String> map = new LinkedHashMap<>();
map.put(3, "C");
map.put(1, "A");
map.put(2, "B");
map.put(2, "BB"); // key=2 更新 value
System.out.println(map); // {3=C, 1=A, 2=BB} 插入顺序保持

哈希在算法中的 10 大经典用法

判断元素是否存在

Set<Integer> set = new HashSet<>();
if (set.contains(x)) {}

去重

Set<Integer> set = new HashSet<>();
for (int n : nums) {
    set.add(n); // HashSet 自动去重
}

统计频率

Map<Integer, Integer> map = new HashMap<>();
for (int n : nums)
    map.put(n, map.getOrDefault(n, 0) + 1);

字符串计数(异位词)

int[] cnt = new int[26];
for (char c : s.toCharArray()) cnt[c - 'a']++;

两数之和(值 → 下标)

Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
    int need = target - nums[i];
    if (map.containsKey(need)) return new int[]{map.get(need), i};
    map.put(nums[i], i);
}

前缀和 + 哈希(子数组和为 k)

Map<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
int sum = 0, res = 0;
for (int n : nums) {
    sum += n;
    res += map.getOrDefault(sum - k, 0);
    map.put(sum, map.getOrDefault(sum, 0) + 1);
}

两数组交集

Set<Integer> set = new HashSet<>();
for (int n : nums1) set.add(n);
Set<Integer> res = new HashSet<>();
for (int n : nums2) if (set.contains(n)) res.add(n);

判断重复元素

Set<Integer> set = new HashSet<>();
for (int n : nums)
    if (!set.add(n)) return true;

分组(分类)

Map<String, List<String>> map = new HashMap<>();
for (String s : strs) {
    String key = sort(s);
    map.computeIfAbsent(key, k -> new ArrayList<>()).add(s);
}

最近最少使用缓存(LRU)

class LRUCache extends LinkedHashMap<Integer, Integer> {
    protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > capacity;
    }
}

数组哈希 vs Map 哈希

当 key 范围固定小(如 a-z):

int[] hash = new int[26];
hash[c - 'a']++;

当 key 范围大或不连续:

Map<Integer, Integer> map = new HashMap<>();
  • 全球 AI 大模型排名:Gemini 3.1 Pro 与 GPT-5.4 并列第一,GLM-5 进前五
  • 医疗 AI 多智能体资源调度:用 Python 构建高性能 MCU 资源池
  • CopilotKit:AI Copilot 前端开发框架
  • GitHub Copilot 账号切换与退出指南
  • openclaw-termux:在 Android 上部署 OpenClaw AI Gateway
  • PyWebView 轻量级跨平台桌面应用开发简介
  • 超越代码生成器:深度解析 Triton-Copilot 的人机协同设计哲学
  • Seedance 2.0 重构 AIGC 工作流:语义理解与映射热更新实践
  • OpenClaw 开源机器人实现空间智能体记忆
  • AG-UI:构建 AI 前端交互的统一协议
  • OpenClaw 开源多模态大模型框架:具身智能与机器人操作
  • OpenClaw 开源 AI Agent 框架核心原理与架构解析
  • 具身智能系统与 VLA 架构入门及实战