HashMap与Hashtable的关键区别 📅 发布时间:2026/7/12 14:38:47 👁️ 浏览次数: 一、先明确核心定位HashMapJava 集合框架中非线程安全的哈希表实现追求极致的单线程性能是日常开发中最常用的键值对存储容器。HashtableJava 早期JDK 1.0提供的线程安全的哈希表实现设计较为简单粗暴目前已基本被ConcurrentHashMap替代。二、HashMap 与 Hashtable 详细区别我会从核心维度拆解每个维度都说明具体差异和背后的原因维度HashMapHashtable1. 线程安全性非线程安全线程安全但实现方式极 “笨重”2. 锁机制无锁所有操作均不做同步处理所有方法put/get/remove/size 等都用synchronized修饰本质是全表加锁- 任何线程操作 Hashtable 时都会锁住整个哈希表- 即使两个线程操作不同的 key也会互相阻塞并发性能极差。3. 空值null支持允许- key 可以为 null仅允许 1 个因为 hash 值固定为 0- value 可以为 null多个。禁止- 无论是 key 还是 value传入 null 都会直接抛出NullPointerException- 原因Hashtable 设计时认为 null 会导致歧义且同步场景下判空会增加复杂度。4. 底层实现 / 结构JDK 1.8 后数组 链表 红黑树链表长度≥8 且数组长度≥64 时转红黑树JDK 1.7数组 链表。始终是数组 链表从未支持红黑树优化底层数组默认大小、扩容阈值等也有差异见下文。5. 哈希计算方式JDK 1.8 优化了哈希算法key.hashCode () → 扰动函数减少哈希冲突 →(n - 1) hash取模高效。直接使用key.hashCode() % table.length取模取模运算效率低于位运算无扰动函数哈希冲突概率更高。6. 初始容量与扩容- 初始容量默认 16- 扩容阈值默认负载因子 0.75当size 容量 * 负载因子时扩容- 扩容规则容量翻倍×2- 支持手动指定初始容量会向上取整为 2 的幂。- 初始容量默认 11- 扩容阈值默认负载因子 0.75- 扩容规则容量变为2 * 原容量 1非 2 的幂进一步降低取模效率- 手动指定的初始容量不会取整直接使用。7. 迭代器特性快速失败fail-fast迭代过程中如果其他线程修改了 HashMap 结构增 / 删节点迭代器会立即抛出ConcurrentModificationException注意单线程下如果迭代时自己修改如 remove也会触发。枚举器Enumeration是快速失败的如果通过keySet().iterator()获取迭代器同样是 fail-fast 特性。8. 继承体系继承AbstractMap类实现Map接口。继承Dictionary类已废弃实现Map接口Dictionary是早期的键值对容器设计上不如AbstractMap优雅。9. 性能表现单线程下性能极高无锁开销哈希计算和扩容更高效。无论单线程 / 多线程性能都差- 单线程全表锁无意义还增加同步开销- 多线程全表锁导致并发度极低线程竞争激烈时性能暴跌。10. 使用场景单线程 / 低并发场景如方法内局部变量、单例中的静态变量且仅单线程操作。几乎无推荐场景- 线程安全场景优先用ConcurrentHashMap并发性能高- 低并发线程安全场景也可使用Collections.synchronizedMap(new HashMap())比 Hashtable 灵活。三、补充Hashtable 被淘汰的核心原因并发性能极差全表锁导致多线程下几乎是串行执行而ConcurrentHashMap仅锁单个桶并发度提升数十倍。设计老旧基于废弃的Dictionary类哈希计算、扩容规则等都未做优化性能远不如 HashMap更不如 ConcurrentHashMap。功能限制不支持 null 值使用场景被进一步压缩。四、代码示例直观感受差异1. 空值支持差异public class HashMapVsHashtable { public static void main(String[] args) { // HashMap 支持 null key/value HashMapString, String hashMap new HashMap(); hashMap.put(null, nullKey); hashMap.put(key1, null); System.out.println(HashMap null key: hashMap.get(null)); // 输出nullKey System.out.println(HashMap null value: hashMap.get(key1)); // 输出null // Hashtable 不支持 null抛 NullPointerException HashtableString, String hashtable new Hashtable(); try { hashtable.put(null, nullKey); // 直接抛异常 } catch (NullPointerException e) { System.out.println(Hashtable 不支持 null key); } try { hashtable.put(key1, null); // 直接抛异常 } catch (NullPointerException e) { System.out.println(Hashtable 不支持 null value); } } }2. 线程安全差异多线程操作import java.util.HashMap; import java.util.Hashtable; public class ThreadSafetyTest { private static HashMapString, Integer hashMap new HashMap(); private static HashtableString, Integer hashtable new Hashtable(); public static void main(String[] args) throws InterruptedException { // 测试 HashMap 线程不安全多线程put可能导致死循环/数据丢失 Runnable hashMapTask () - { for (int i 0; i 1000; i) { hashMap.put(Thread.currentThread().getName() i, i); } }; // 测试 Hashtable 线程安全不会出现数据错乱但并发慢 Runnable hashtableTask () - { for (int i 0; i 1000; i) { hashtable.put(Thread.currentThread().getName() i, i); } }; Thread t1 new Thread(hashMapTask); Thread t2 new Thread(hashMapTask); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(HashMap 最终大小可能≠2000 hashMap.size()); // 数据丢失/错乱 Thread t3 new Thread(hashtableTask); Thread t4 new Thread(hashtableTask); t3.start(); t4.start(); t3.join(); t4.join(); System.out.println(Hashtable 最终大小一定2000 hashtable.size()); // 数据完整 } }总结核心差异HashMap非线程安全、支持 null、单线程性能高Hashtable线程安全全表锁、不支持 null、并发性能极差。使用选择单线程用HashMap多线程安全场景优先用ConcurrentHashMap而非 Hashtable。设计层面Hashtable 是早期设计的产物哈希计算、扩容、锁机制均无优化现已被淘汰仅作历史知识点了解即可。
Linux 信号量,环形队列模拟生产者消费者模型 1.信号量信号量本质上就是一个受原子操作保护的计数器。1.1 故事1在日常生活中,我们想要去看电影,就需要先买票,也就是相当于预定一个影院里面的座位,加入有100个座位,我们就相当于预定了100个座位中的一个,… 2026/5/17 8:33:39
Python flask微信小程序基于Android的社区商品团购系统的设计与实现_ebnbrqe2 目录技术栈选择系统模块划分关键接口设计数据库设计开发里程碑测试策略部署方案开发技术路线源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!技术栈选择 后端框架采用Python Flask,轻量级且适合快速开发RESTful API。数据库使… 2026/7/11 22:44:52
告别笔记杂乱!Trilium Notes+cpolar,随时随地管好你的知识库 Trilium Notes 是一款适配 Windows、macOS、Linux 多平台的开源笔记工具,核心优势在于树状结构的无限嵌套式笔记管理,既能支撑富文本、Markdown、公式、流程图等多样化编辑需求,还自带全文搜索、笔记加密、版本控制功能,不管是程序… 2026/7/11 13:43:15
别再盲盒抽卡!内容创作者如何搭建专属 Seedance 2.0 视频提示词模板库? AI 视频生成正迅速步入工业化量产时代。作为近期备受瞩目的视频生成大模型,Seedance 2.0 凭借出色的物理规律理解和原生音画同步能力,成为不少创作者的生产力工具。然而,许多创作者在使用 yingcaiai.com(AI 模型聚合平台ÿ… 2026/7/12 14:36:23
DCIM 3.0 架构解析:从1.0集成化到3.0云化AI化的5级演进路径 DCIM 3.0 架构解析:从1.0集成化到3.0云化AI化的5级演进路径数据中心基础设施管理(DCIM)技术正经历从基础监控到智能运营的质变。当L5级系统自动调节设备负载时,制冷能耗可降低40%——这标志着数据中心管理已进入算法驱动时代。本文… 2026/7/12 14:36:23
AD7490与PIC18LF26K42构建高精度数据采集系统 1. AD7490与PIC18LF26K42的硬件选型解析在嵌入式系统设计中,模拟信号采集是连接物理世界与数字系统的关键环节。AD7490作为ADI公司推出的16位逐次逼近型(SAR)ADC芯片,与Microchip的PIC18LF26K42单片机组合,能够构建高性价比的数据采集系统。这… 2026/7/12 14:34:22
SSMS 22 性能调优:3 项关键设置提升大型数据库查询效率 20% SSMS 22 性能调优:3 项关键设置提升大型数据库查询效率 20% 当数据库表规模突破10GB门槛时,即使是经验丰富的DBA也会面临查询响应缓慢的困扰。许多开发者习惯将性能问题归咎于SQL语句或索引设计,却忽略了SSMS工具本身的配置优化空间。事实上&… 2026/7/12 14:32:21
终极指南:如何在5分钟内掌握CAN数据库格式转换 终极指南:如何在5分钟内掌握CAN数据库格式转换 【免费下载链接】canmatrix Converting Can (Controller Area Network) Database Formats .arxml .dbc .dbf .kcd ... 项目地址: https://gitcode.com/gh_mirrors/ca/canmatrix canmatrix是一个强大的Python包&… 2026/7/12 14:32:21
1080p、2K、4K 分辨率选购避坑:从像素定义到屏幕实测的 3 个关键误区 1080p、2K、4K分辨率选购避坑指南:从像素定义到屏幕实测的3个关键误区 当你站在电器卖场的显示器专区,面对琳琅满目的"4K超清"、"2K电竞"、"1080p全高清"标签时,是否曾困惑这些数字背后的真实含义?… 2026/7/12 14:30:20
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14