Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

Hashtable 与 HashMap 的 null 和查询语义有何不同?

先说出你的答案

定义边界、关键机制、一个反例;P8题再补容量、失败与验证。

查看完整题解

参考回答

直接回答

HashMap 允许 null 键和值,Hashtable 都不允许;HashMap 的 get 返回 null,既可能是没有该键,也可能是该键对应 null,需要 containsKey 辅助区分。Hashtable 常用方法有同步保护,但多个调用拼起来仍不自动原子化。这些差异会影响查询逻辑和旧代码迁移。

讲清原理

“返回 null 就是不存在”在允许 null 值的映射中并不成立。containsKey 查的是映射是否存在,get 查的是关联值。HashMap 的 computeIfAbsent 则把“没有映射”和“映射值为 null”都作为需要计算的情况,这是方法本身的约定。

两次查询如果跨线程发生,中间仍可能变化。即便容器每个方法都同步,也不能把 containsKey 与 get 当成一个不可分割的判断。

例子与易错点

Java 21 的 main 片段:

var map = new java.util.HashMap<String, String>();
map.put("known", null);
System.out.println(map.get("known") == null);
System.out.println(map.containsKey("known"));
System.out.println(map.containsKey("missing"));

输出 true、true、false。迁移 Hashtable 到 HashMap 时,要同时检查调用方是否依赖拒绝 null 和同步行为;换类名并不等于保留全部约束。需要并发且拒绝 null 的映射时,还应评估 ConcurrentHashMap。

相关题:第 3 题、第 19 题、第 26 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。