钩子:从名单到键值对
存全班学生名单,ArrayList 够用。但问题变成"输入学号,立刻查出姓名"呢?
用 List 的笨办法:遍历全表,一个一个比学号。1000 个学生平均要比 500 次——数据到 100 万呢?
人类的直觉早就给出了更好的结构:学号 → 姓名,一对一映射,报出学号直接翻到那行。这就是键值对(key-value),Java 里的实现叫 HashMap。
核心:HashMap 上手
import java.util.HashMap;
HashMap<String, String> stu = new HashMap<>();
stu.put("2026001", "张三"); // 存:key=学号, value=姓名
stu.put("2026002", "李四");
stu.put("2026003", "王五");
System.out.println(stu.get("2026002")); // 李四,瞬间命中
System.out.println(stu.containsKey("2026009")); // false
stu.remove("2026003"); // 按key删
System.out.println(stu.size()); // 2
get(key) 不用遍历——不管存了 10 条还是 1000 万条,查找速度几乎不变。这是 HashMap 最值钱的特性。
正题:key 能重复吗?
上标题里的问题,直接用代码回答:
stu.put("2026001", "张三");
stu.put("2026001", "橙码酱"); // key 再来一次?
System.out.println(stu.get("2026001")); // 橙码酱
System.out.println(stu.size()); // 没变多
key 不能重复。同一个 key 再次 put,不会报错、不会存两份,而是覆盖旧值——返回值就是被覆盖的那个旧 value(没人接住就丢掉,老规矩)。
所以 HashMap 天然适合做"去重 + 最新值":比如统计单词出现次数,key 是单词,value 是次数,put 前先 get 一下旧次数加一再放回去。

为什么 HashMap 快?(面试版答案)
不展开源码(那是进阶课),但原理要懂个轮廓:
HashMap 内部是一个数组,put 时对 key 做一次"哈希计算"——把 key 变成一个下标,value 直接放进对应格子。get 时对同一个 key 算出同一个下标,一步直达,根本不用遍历。
这也回答了标题里的另一半——为什么 HashMap 的 key 推荐 String?
- String 不可变(第 21 篇):key 存进去之后哈希值永远稳定,不会"存进去就找不到了";
- String 已重写 equals 和 hashCode(第 22 篇):内容相同的 key 能正确命中同一格。
两篇前的知识今天合流——系列就是这么一环扣一环的。
本文示例代码均已本地实测通过,可直接运行。
对应文件:MapDemo.java
橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。