hashtable 不允许键或值为 null,hashmap 允许一个 null 键和任意多个 null 值;hashmap 将 null 键存于数组索引 0,hashtable 遇 null 键/值直接抛 nullpointerexception;hashmap 中 get(null) 返回 null 有二义性,需用 containskey 判断,hashtable 无此问题;concurrenthashmap 同 hashtable,不支持 null 键值。

Hashtable 不允许键或值为 null,而 HashMap 允许一个 null 键和任意多个 null 值。
空键处理:HashMap 支持,Hashtable 直接抛异常
HashMap 在内部对 null 键做了特殊处理——它会跳过哈希计算,直接将该键值对存入数组索引 0 的位置。因此可以安全地调用 put(null, "value") 或 get(null)。
Hashtable 则在 put 方法开头就检查 key 是否为 null,一旦发现立即抛出 NullPointerException。这是设计上的硬性限制,没有绕过方式。
空值处理:同样泾渭分明
HashMap 对 value 为 null 完全放开,可多次插入不同 key 对应的 null 值,例如:map.put("a", null); map.put("b", null); 都合法。
Hashtable 同样在 put 中显式校验 value,若为 null 就抛出 NullPointerException。它的逻辑是“键值都不许空”,不区分对待。
使用时的关键影响
由于 HashMap 允许 null 键,get(key) 返回 null 时存在二义性:可能是键不存在,也可能是该键对应值就是 null。所以必须用 containsKey(key) 来准确判断键是否存在。
Hashtable 没有这个问题——只要 get(key) 返回 null,就说明键一定不存在。
ConcurrentHashMap 和 Hashtable 一致,也不接受 null 键或值,这是为了在并发场景下避免因 null 引发的歧义和潜在 NPE。










