能,HashMap允许且仅允许一个null键,通过特殊分支将null键直接存入table[0]并用==判断覆盖,get(null)返回值或null(无法区分不存在与值为null),ConcurrentHashMap则禁止null键。

HashMap 允许键为 null,且只允许一个 null 键。它不是把 null 当作普通对象参与哈希计算,而是专门处理:在存储和查找时直接走特殊分支,跳过哈希计算和桶位定位逻辑。
为什么 null 键能存且只能存一个
因为 null.hashCode() 会抛出 NullPointerException,所以 HashMap 在内部做了规避:
- 插入时,如果键是
null,直接放入数组索引为 0 的位置(即table[0]) - 查找时,遇到
null键,也只检查table[0]处的链表或红黑树节点 - 由于所有
null键都强制映射到同一个位置,且null == null为 true,所以重复 putnull键会覆盖旧值,不会新增条目
如何安全地存取 null 键
语法上完全正常,无需额外判断,但需注意语义:
- 存:
map.put(null, "value")—— 成功,返回之前的值(可能是null) - 取:
map.get(null)—— 返回对应值,若未存过则返回null - 判存:
map.containsKey(null)返回true或false,比get(null) != null更准确(避免值本身为null的歧义) - 删:
map.remove(null)—— 删除并返回被移除的值
实际使用中的注意事项
null 键虽然合法,但容易引发理解偏差和空指针风险:
立即学习“Java免费学习笔记(深入)”;
- 不建议在业务代码中主动用
null作键;可用空字符串、特殊常量(如MISSING_KEY)替代 - 遍历
keySet()或entrySet()时,null键会被包含在内,需留意key == null的分支处理 - 若用
ConcurrentHashMap,则 不允许null键或值,调用会直接抛NullPointerException
本质上,null 键是 HashMap 为兼容性保留的特殊约定,底层靠硬编码位置(table[0])和引用相等性(==)实现,不依赖哈希与 equals。


















