社交媒体

HashMap 的 key 能重复吗

HashMap 的 key 能重复吗

钩子:从名单到键值对

存全班学生名单,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 一下旧次数加一再放回去。

24-HashMap键值对存储图.png

为什么 HashMap 快?(面试版答案)

不展开源码(那是进阶课),但原理要懂个轮廓:

HashMap 内部是一个数组,put 时对 key 做一次"哈希计算"——把 key 变成一个下标,value 直接放进对应格子。get 时对同一个 key 算出同一个下标,一步直达,根本不用遍历。

这也回答了标题里的另一半——为什么 HashMap 的 key 推荐 String?

  1. String 不可变(第 21 篇):key 存进去之后哈希值永远稳定,不会"存进去就找不到了";
  2. String 已重写 equals 和 hashCode(第 22 篇):内容相同的 key 能正确命中同一格。

两篇前的知识今天合流——系列就是这么一环扣一环的。


本文示例代码均已本地实测通过,可直接运行。
对应文件:MapDemo.java


橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。