HashMap允许一个null键和任意多个null值;null键固定存于bucket[0]且不可重复,null值合法但get()返回null无法区分键不存在与值为null,需结合containsKey()或getOrDefault()判断。

Java 中的 HashMap 允许 一个 null 键 和 任意多个 null 值,但处理方式有明确规则,稍不注意容易引发逻辑错误或 NullPointerException。
空键(null as key)的特殊性
HashMap 对 null 键做了单独处理:它不调用 hashCode() 方法,而是直接固定存放在哈希表的第 0 号桶(bucket[0])中。这意味着:
- 整个
HashMap中最多只允许一个null键 —— 后续对put(null, value)的调用会覆盖之前的null键值对; - 所有以
null为键的get()、remove()、containsKey()操作都直接访问 bucket[0],不依赖哈希计算; - 如果代码中存在多个语义上不同的“空引用”(如
Employee e1 = null;、Employee e2 = null;),它们在HashMap中都等价于同一个null键,不会区分。
空值(null as value)的合法性
HashMap 完全允许任意键对应 null 值,例如:
-
map.put("name", null);是合法的; - 多个不同键可以同时映射到
null值,互不影响; - 但要注意:
map.get(key) == null并不能说明该键不存在 —— 它可能确实存在,只是值被设为了null。
安全判断键是否存在且值非空
仅靠 get() 返回 null 无法区分“键不存在”和“键存在但值为 null”。推荐组合使用:
立即学习“Java免费学习笔记(深入)”;
- 先用
containsKey(key)确认键是否存在; - 再用
get(key)获取值,并显式判空(如Objects.nonNull(value)或value != null); - 或改用
getOrDefault(key, defaultValue),避免空值干扰业务逻辑; - 更函数式写法可搭配
Optional.ofNullable(map.get(key))进行链式处理。
与其他 Map 实现的对比
不是所有 Map 都支持 null 键/值:
-
HashMap:支持一个null键、多个null值; -
Hashtable、ConcurrentHashMap:不允许null键或null值,插入时直接抛NullPointerException; -
LinkedHashMap、TreeMap:继承HashMap或自身逻辑,LinkedHashMap支持null键/值,TreeMap不允许null键(因比较需要,除非自定义Comparator处理null)。


















