hashmap和concurrentHashmap是否允许null值和null健
文章目录
- 一、HashMap 对 null 的支持
- 示例:
- 二、ConcurrentHashMap 对 null 的支持
- 原因:
- 示例:
- 三、总结对比
在 Java 中,
HashMap
和ConcurrentHashMap
对null
键(key)和null
值(value)的支持存在显著差异,这与它们的设计目标(单线程 vs 多线程安全)直接相关:
一、HashMap 对 null 的支持
HashMap
允许 null 键和 null 值,具体规则如下:
- null 键:整个
HashMap
中只能有一个 null 键(因为键是唯一的),它会被特殊处理并存储在哈希表的第 0 个桶(bucket)中。- null 值:可以有多个 null 值(只要对应的键不同)。
示例:
HashMap<String, String> map = new HashMap<>();
map.put(null, "value1"); // 允许 null 键
map.put("key2", null); // 允许 null 值
map.put(null, "value3"); // 覆盖之前的 null 键对应的值System.out.println(map.get(null)); // 输出 "value3"(覆盖后的值)
System.out.println(map.get("key2")); // 输出 null
二、ConcurrentHashMap 对 null 的支持
ConcurrentHashMap
不允许 null 键和 null 值,无论是键还是值为null
,都会抛出NullPointerException
。
原因:
ConcurrentHashMap
设计用于多线程并发场景,需要通过返回值判断操作结果(如get(key)
方法)。如果允许null
值,当方法返回null
时,无法区分“键不存在”和“键存在但值为 null”,可能导致并发场景下的逻辑错误。
示例:
ConcurrentHashMap<String, String> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put(null, "value"); // 抛出 NullPointerException
concurrentMap.put("key", null); // 抛出 NullPointerException
三、总结对比
集合类 | 是否允许 null 键 | 是否允许 null 值 | 核心原因 |
---|---|---|---|
HashMap | 允许(仅一个) | 允许(多个) | 单线程场景,无需处理并发歧义 |
ConcurrentHashMap | 不允许 | 不允许 | 多线程场景,避免返回值歧义 |
实际开发中,若需在并发场景中使用类似“空值”的标记,可使用一个特殊的占位符对象(如
new Object()
)替代null
,避免NullPointerException
。