首页/新闻资讯/正文详情

HashMap、Hashtable、ConcurrentHashMap 区别详解

发布时间:2026/11/5 7:56:53 来源:云帆数科 栏目:资讯中心
HashMap、Hashtable、ConcurrentHashMap 区别详解
在 Java 集合框架中HashMap、Hashtable、ConcurrentHashMap 都是基于哈希表实现的键值对容器三者最核心的差异集中在线程安全机制、锁粒度设计、并发性能三个维度也是 Java 并发面试的高频基础考点。本文从底层实现到特性差异逐一拆解帮你彻底理清三者的区别与选型逻辑。一、各实现详细解析1. HashMap单线程性能首选HashMap 是日常开发最常用的哈希表实现不做任何线程安全处理因此单线程环境下没有锁开销性能最高。核心特性底层结构JDK1.8 之后采用「数组 链表 / 红黑树」实现。当链表长度超过 8 且数组长度大于 64 时链表会转换为红黑树解决哈希冲突严重时的查询性能退化问题。空值支持允许最多 1 个 key 为 null允许多个 value 为 null。并发风险多线程环境下会出现数据覆盖、size 计数不准、扩容死循环JDK1.7 头插法等异常禁止在并发场景下直接使用。2. HashtableHashtable 是 JDK 早期提供的线程安全哈希表实现方式非常粗暴所有核心方法都加上 synchronized 关键字直接锁整个 Hashtable 对象。核心特性锁粒度极粗整张表只有一把锁。无论线程操作哪个位置的数据都会产生锁竞争并发性能极差。扩容开销大触发扩容时由单个线程完成全部元素的拷贝迁移过程耗时久。不支持 nullkey 和 value 都不允许为 null否则会抛出空指针异常。现状锁设计过于原始性能低下目前已经被 ConcurrentHashMap 完全替代仅作为历史遗留类存在不推荐在新代码中使用。3. ConcurrentHashMap高并发场景的最优解ConcurrentHashMap 是为并发场景设计的线程安全哈希表。以Java1.8为例彻底取消了分段锁改用更细粒度的桶级锁并做了多处优化读操作无锁读取数据时不加锁通过 volatile 关键字保证数据的内存可见性直接从主内存读取最新值。写操作锁桶仅对当前操作的哈希桶链表头结点加 synchronized 锁只有两个线程恰好操作同一个桶时才会冲突锁粒度远小于分段锁。CAS 辅助更新size 计数等属性通过 CAS 原子更新避免重量级锁。化整为零扩容扩容时新老数组同时存在每个操作哈希表的线程都会协助迁移一部分元素分散扩容开销避免单线程长时间阻塞。扩容期间插入只写入新数组查询需要同时检索新老数组全部元素迁移完成后再删除老数组。不支持 null和 Hashtable 一样禁止 null 键值。原因是并发场景下get 返回 null 无法区分「值本身是 null」还是「key 不存在」会产生语义歧义。二、核心演进逻辑锁粒度不断细化三者的性能差异本质上是锁粒度不断细化的演进过程Hashtable全表一把锁 → 所有操作都冲突性能最差ConcurrentHashMap 1.8桶级锁 → 同桶才冲突性能最优锁的粒度越细并发冲突的概率就越低高并发下的性能表现就越好。三、选型总结单线程环境优先使用 HashMap无锁开销性能最高。多线程环境使用 ConcurrentHashMap兼顾线程安全与并发性能是目前的工业标准方案。Hashtable 仅作为历史知识了解不要在新项目中使用。

相关推荐

PostgreSQL 建了索引仍然全表扫描:1000 万行表 ANALYZE 前后的执行计划对比
PostgreSQL 建了索引仍然全表扫描:1000 万行表 ANALYZE 前后的执行计划对比

本文摘要:1000 万行表建好索引,查询仍走全表扫描,先怀疑索引往往查不到根因。用 EXPLAIN 对比 ANALYZE 前后执行计划,可看到默认选择率 0.005 如何让优化器放弃索引。 一、问题与结论 一张 orders 表 1000 万行,idx_o… · 2026/11/5 7:56:53

高精度计算入门与immense数据模型精讲(收官)
高精度计算入门与immense数据模型精讲(收官)

跳转链接 高精度计算入门与immense数据模型精讲(一)高精度计算入门与immense数据模型精讲(二)高精度计算入门与immense数据模型精讲(三)高精度计算入门与immense数据模型精讲(四)高… · 2026/11/5 7:56:53

程序卡住了?多进程多线程让你的 Python“多任务并行“ 跑起来
程序卡住了?多进程多线程让你的 Python“多任务并行“ 跑起来

程序运行慢,很多时候是它 "只肯一次干一件事"。这篇老哥带你搞懂 并发 / 并行、进程 / 线程,让程序真正 "多任务跑起来"。一、并发 vs 并行并发(Concurrency):单个 CPU 轮流处理多个任务&#xff… · 2026/11/5 7:55:52

10A太阳能充电控制器开源图纸:PWM直充与三段式充电调试
10A太阳能充电控制器开源图纸:PWM直充与三段式充电调试

简介:面向电子爱好者与嵌入式开发者的10A太阳能充电控制器开源方案,包含完整原理图与固件源码,适用于中小型光伏系统的学习、复刻与二次开发。压缩包共390个文件、约1.99MB,以c/h源码与工程配置为主,辅以sch原理图、pc… · 2026/11/5 8:21:05

自动驾驶NMPC与MPC路径规划控制技术解析
自动驾驶NMPC与MPC路径规划控制技术解析

1. 自动驾驶规划控制的核心挑战在自动驾驶系统开发中,规划控制模块直接决定了车辆行驶的平顺性和安全性。传统PID控制虽然简单易实现,但在复杂动态环境下往往表现不佳。这正是我们需要引入NMPC(非线性模型预测控制)和MPC&#xff… · 2026/11/5 8:21:05

Oracle到DuckDB日期函数迁移与连续区间计算实践
Oracle到DuckDB日期函数迁移与连续区间计算实践

1. 从Oracle到DuckDB:日期处理函数的迁移实践在数据库迁移或跨平台开发过程中,日期时间函数的兼容性处理是个高频痛点。最近我在处理一个VIP会员续费分析系统时,需要将原本运行在Oracle上的"连续会员区间计算"逻辑迁移到DuckDB。这… · 2026/11/5 8:21:05

C#解析.rofl回放元数据:LeagueReplayParser批量落库
C#解析.rofl回放元数据:LeagueReplayParser批量落库

简介:LeagueReplayParser 是面向《英雄联盟》重放解析的 C# 类库,可读取文档目录下扩展名为 .rofl 的重放文件,并围绕客户端版本与重放启动提供基础能力,适合研究比赛统计、回放分析或客户端重放流程的开发者参考;解析… · 2026/11/5 8:21:05

拆解安全厂商17K*15:公积金基数、年终奖与谈薪避坑
拆解安全厂商17K*15:公积金基数、年终奖与谈薪避坑

拿到 Offer 了!某安全厂商 17K15——这个数字组合在安全圈的校招和社招群里一出现,讨论热度基本能顶到当天最高。17K 的月薪基数、15 个月的年薪包,听起来是应届生里相当能打的一档,不少人第一反应就是"年包 25.5 万&#xf… · 2026/11/5 8:21:05

四轴机械臂反解实战:牛顿迭代法的MATLAB实现与嵌入式移植
四轴机械臂反解实战:牛顿迭代法的MATLAB实现与嵌入式移植

简介:本资源面向机器人学初学者与MATLAB实践者,聚焦四轴机械臂逆运动学核心问题——关节反解,系统讲解雅可比矩阵原理、牛顿迭代法数值求解流程及其实现要点。资源包含1个MATLAB仿真脚本(.m)与1份英文权威参考资料PDF&… · 2026/11/5 8:20:04

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码