【Java】HashMap的key可以为null吗?如何存储的?
可以。HashMap中key
为null时,哈希函数返回0,即hash(null)=0
,因此null
键会被存储在数组索引0的位置。
一、null作为key的存储逻辑:
1.计算哈希值:
在哈希函数中,明确对null做了特殊处理,直接返回哈希值0.
JDK1.8
static final int hash(Object key) {int h;// 若 key 为 null,直接返回 0return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
2.计算数组索引:
哈希值为0后,通过 hash & (容量 - 1)
计算存储的数组索引.
即 0 & (容量 - 1) = 0)。
因此,null作为key时,必然存储在数组的索引0位置。(第一个桶)。
3.唯一约束:
HashMap中仅允许存在一个null键.
若多次插入null键,新的value会覆盖旧的value。
例子:
HashMap<String, Integer> map = new HashMap<>();
map.put(null, 1); // 插入 null 键,值为 1
map.put(null, 2); // 再次插入 null 键,值会覆盖为 2
map.put("a", 3); // 插入普通键System.out.println(map.get(null)); // 输出 2(覆盖后的值)
System.out.println(map.size()); // 输出 2(仅 1 个 null 键 + 1 个 "a" 键)
二、总结:
- HashMap 允许 key 为 null,且仅能存在一个 null 键(多次插入会覆盖值)。
- null 键的哈希值固定为 0,因此始终存储在数组的索引 0 位置。
- 这一设计与 Hashtable 形成对比(Hashtable 对 null 键会直接抛出 NullPointerException)。