迁移 HashMap 与 Hashtable 时要保留哪些约束?
查看完整题解
参考回答
直接回答
两者都保存键值映射,但迁移时要检查同步、null、遍历和复合操作语义。HashMap 无内置同步,允许 null 键和值;Hashtable 常用方法同步且拒绝 null。不能只替换构造器就认为行为等价,也不能假设某一种实现提供稳定的键迭代顺序。
讲清原理
旧代码可能利用 Hashtable 对 null 的拒绝尽早发现错误,也可能依赖方法同步。换成 HashMap 后,这些保护不会自动存在;反向替换又可能让原本允许的 null 数据抛异常。
如果需要保留共享访问,可评估 synchronizedMap 与 ConcurrentHashMap,但两者也不完全等价。前者需要按包装器的同步规则遍历,后者的迭代是弱一致的,且不接受 null。方法名相同不代表完整契约相同。
例子与易错点
业务通过 get 返回 null 判断“编号不存在”,若新容器允许保存 null 值,就需重新明确约定。又如原流程依次执行 containsKey 与 put,改成同步容器仍不能让这两步自动合并。
迁移检查应围绕实际用法:哪些线程访问、键和值能否为 null、是否依赖遍历期间不变、更新是否必须原子完成。只有这些条件吻合,类型替换才有依据。
相关题:第 3 题、第 12 题、第 19 题、第 45 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。