在Java里HashMap与Hashtable有什么区别_Java映射类对比说明

发布时间 - 2026-01-25 00:00:00    点击率:
应避免使用 Hashtable,优先选择 ConcurrentHashMap(线程安全)或 HashMap(单线程高效);它因全表同步、不支持 null、非 fail-fast、API 过时等问题已被淘汰。

别用 Hashtable,除非你在维护 JDK 1.0 时代的遗留系统。 它已被明确淘汰,ConcurrentHashMapHashMap 覆盖了全部合理场景。

线程安全不是免费的:synchronized 方法拖垮性能

Hashtable 所有 public 方法(如 put()get()size())都加

synchronized,相当于整张表一把大锁。哪怕两个线程操作完全不冲突的 key,也得排队——这是它在单线程/低并发下比 HashMap 慢 2–5 倍的主因。

  • 多线程写入时,Hashtable 会严重阻塞;ConcurrentHashMap 则分段加锁或使用 CAS,吞吐量高得多
  • HashMap 完全不处理线程安全,直接裸奔——在单线程或已由外部同步(如 synchronized 块包裹)的场景下,它最轻快
  • 想“临时线程安全”?Collections.synchronizedMap(new HashMap()) 可行,但仅保证单个方法原子性,迭代 + 修改 这类复合操作仍需手动同步

null 键值支持:一个报错,一个容忍

Hashtablenull 零容忍:put(null, "v")put("k", null) 立刻抛 NullPointerException;而 HashMap 允许一个 null 键(存放在桶数组索引 0 处)和任意多个 null 值。

  • 这是最常踩的坑:把 HashMap 替换为 Hashtable 时,只要代码里存在 map.put(key, value) 且任一变量可能为 null,运行期必崩
  • 反向替换(HashtableHashMap)通常安全,但要注意逻辑是否隐式依赖“null 不可存”的行为(比如用 get(k) == null 判断 key 不存在——在 HashMap 中这可能是 key 不存在,也可能是 key 存在但值为 null

迭代器行为差异:fail-fast 是调试利器

HashMapIterator 是 fail-fast 的:遍历时若其他线程或同一线程未通过迭代器修改结构(如 remove()),会立即抛 ConcurrentModificationExceptionHashtableEnumeration(老式遍历)和 Iterator(因实现 Map 接口而支持)都不保证 fail-fast,可能返回脏数据或静默失败。

  • 这意味着:用 HashMap 时,迭代中误调 map.remove(k) 会立刻暴露问题;用 Hashtable 可能跑完才出错,或结果不可靠
  • 安全遍历删除必须用迭代器自身的 remove() 方法,例如:
    Iterator> it = map.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry e = it.next();
        if (e.getValue() < 0) it.remove(); // ✅ 正确
    }

继承与 API 设计:Dictionary 已成历史名词

Hashtable 继承自早已废弃的抽象类 Dictionary(JDK 1.0),而 HashMap 直接实现 Map 接口并继承 AbstractMap(JDK 1.2 引入)。这也导致部分 API 不一致:

  • Hashtablecontains(Object value) 方法(易误解为查 key),HashMap 已移除,只留 containsKey()containsValue()
  • Hashtable 初始容量是 11,扩容为 2 * old + 1HashMap 初始为 16(2 的幂),扩容为 old * 2,配合位运算优化 hash 定位
  • Hashtable 没有 computeIfAbsent()merge() 等 Java 8+ 函数式方法,强行用会触发编译错误

真正需要线程安全时,选 ConcurrentHashMap;单线程或可控并发,选 HashMapHashtable 唯一合理的存在理由,是对接某些强制要求其类型的老旧 API——这种情况下,务必确认 null 处理和迭代逻辑不会翻车。


# java  # ai  # 区别  # 编译错误 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: javascript中的try catch异常捕获机制用法分析  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  Laravel如何创建自定义Artisan命令?(代码示例)  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  如何在建站主机中优化服务器配置?  香港服务器选型指南:免备案配置与高效建站方案解析  移动端脚本框架Hammer.js  如何快速配置高效服务器建站软件?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  香港服务器部署网站为何提示未备案?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel怎么为数据库表字段添加索引以优化查询  iOS正则表达式验证手机号、邮箱、身份证号等  Laravel Fortify是什么,和Jetstream有什么关系  长沙做网站要多少钱,长沙国安网络怎么样?  Python图片处理进阶教程_Pillow滤镜与图像增强  ,在苏州找工作,上哪个网站比较好?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Python制作简易注册登录系统  Linux系统命令中screen命令详解  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  简历没回改:利用AI润色让你的文字更专业  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Laravel如何自定义错误页面(404, 500)?(代码示例)  如何做网站制作流程,*游戏网站怎么搭建?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  详解Huffman编码算法之Java实现  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  如何用免费手机建站系统零基础打造专业网站?  如何在IIS管理器中快速创建并配置网站?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Python3.6正式版新特性预览  EditPlus中的正则表达式 实战(1)  WEB开发之注册页面验证码倒计时代码的实现  教学论文网站制作软件有哪些,写论文用什么软件 ?  详解Android中Activity的四大启动模式实验简述  如何在服务器上配置二级域名建站?