哈希表(算法)

哈希表 (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) (先排序再去重) | |

缺点:

  1. 无序性:它不记顺序。如果你想找"分数在80到90之间的所有学生",哈希表会直接罢工。

  2. 空间消耗:为了保证速度,它通常会占用比实际数据更多的内存。OS:不过打竞赛的时候拿空间换速度还是很值的

用法:

一:存在性检查 (判断在或不在)

这是哈希表的看家本领。用 HashSet 可以实现闪电般的判断。

复制代码
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        // 创建一个登记簿
        HashSet<String> set = new HashSet<>();
        set.add("张三");
        set.add("李四");

        // 瞬间检查"李四"是否已登记
        if (set.contains("李四")) {
            System.out.println("李四已经登记过了!");
        }
    }
}
二:键值对存取 (根据A找B)

HashMap 就像一个完美的档案柜,根据唯一的标签(Key)瞬间存取档案内容(Value)。

复制代码
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        // 创建一个"学号 -> 分数"的档案柜
        HashMap<String, Integer> map = new HashMap<>();
        map.put("S01", 95);
        map.put("S02", 88);

        // 根据学号"S01"瞬间拿到他的分数
        int score = map.get("S01");
        System.out.println("S01的分数是: " + score); // 输出: 95
    }
}
三:数据去重 (过滤重复项)

HashSet 天生不允许重复,是最高效的"去重神器"。

复制代码
import java.util.ArrayList;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        // 一个有重复水果的列表
        ArrayList<String> list = new ArrayList<>();
        list.add("苹果");
        list.add("香蕉");
        list.add("苹果");

        // 直接把列表"扔"进HashSet,自动去重
        HashSet<String> set = new HashSet<>(list);
        
        System.out.println("去重之后: " + set); // 输出: [苹果, 香蕉]
    }
}
相关推荐
二哈赛车手3 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
吃好睡好便好3 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~3 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8293 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅4 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
未若君雅裁5 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记6 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI6 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
x_yeyue6 小时前
三角形数
笔记·算法·数论·组合数学