ConcurrentHashMap、Hashtable、HashMap

ConcurrentHashMap和HashTable区别?(超详细解释) ConcurrentHashMap和HashTable区别? 阅读详情

一、区别总结

1️⃣HashMap 是非线程安全的,不适用于多线程资源共享场景,在单线程场景下性能最好。在多线程环境中,需要手动实现同步机制。HashMap 中,null 可以作为键,这样的键只有一个,但可以有一个或多个键所对应的值为 null。当 get() 返回 null 时,既可以表示 HashMap 中没有该 key,也可以表示该 key 所对应的 value 为 null。因此,在 HashMap 中不能用 get() 来判断是否存在某个 key,应该用 containsKey() 来判断。

2️⃣Hashtable 的 API 都是 sychronized 的,因此是线程安全的,可以直接用在多线程环境中。由于 Hashtable 中的所有数据都加了同步锁,因此性能最差。Hashtable 中,无论是 key 还是 value 都不能为 null。

3️⃣HashMap 的迭代器(Iterator)是 fail-fast 迭代器,而 Hashtable 的 enumerator 迭代器不是 fail-fast 的。所以当有其它线程改变了 HashMap 的结构(增加或者移除元素),将会抛出 ConcurrentModificationException,但迭代器本身的 remove() 移除元素则不会抛出 ConcurrentModificationException。但这并不是一定发生的行为,要看 JVM。

4️⃣Hashtable 和 HashMap 都实现了 Map 接口,但是 Hashtable 的实现是基于 Dictionary 抽象类的。Java5 提供了 ConcurrentHashMap,它是 Hashtable 的替代,比 Hashtable 的扩展性更好。ConcurrentHashMap 在 HashMap 的基础上对其所存的数据进行了分段,每个分段都有一个锁,当读的时候不受锁的影响,只有在写的时候受锁的限制,缩小了锁的范围,不同段之间不受锁竞争影响,既保证了线程安全,又提升了性能。ConcurrentHashMap 类是 Java 并发包 java.util.concurrent中提供的一个线程安全且高效的 HashMap 实现。在 JDK7 中采用分段锁的方式;JDK8 中直接采用了 CAS(无锁算法)+ sychronized。

5️⃣Segment 类继承于 ReentrantLock 类,从而使得 Segment 对象能充当锁的角色。每个 Segment 对象用来守护其(成员对象 table 中)包含的若干个桶。

table 是一个由 HashEntry 对象组成的数组。table 数组的每一个数组成员就是散列映射表的一个桶。

count 变量是一个计数器,它表示每个 Segment 对象管理的 table 数组(若干个 HashEntry 组成的链表)包含的 HashEntry 对象的个数。每一个 Segment 对象都有一个 count 对象来表示本 Segment 中包含的 HashEntry 对象的总数。注意,之所以在每个 Segment 对象中包含一个计数器,而不是在 ConcurrentHashMap 中使用全局的计数器,是为了避免出现“热点域”而影响 ConcurrentHashMap 的并发性。

二、ConcurrentHashMap (线程安全)

  • 底层采用分段的数组+链表实现
  • 通过把整个 Map 分为N个 Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。(读操作不加锁,由于 HashEntry 的 value 变量是 volatile 的,也能保证读取到最新的值。)
  • Hashtable 的 synchronized 是针对整张 Hash 表的,即每次锁住整张表让线程独占,ConcurrentHashMap 允许多个修改操作并发进行,其关键在于使用了锁分离技术。
  • 有些方法需要跨段,比如 size() 和 containsValue(),它们可能需要锁定整个表而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。
  • 扩容:段内扩容(段内元素超过该段对应 Entry 数组长度的 75% 触发扩容,不会对整个 Map 进行扩容),插入前检测是否需要扩容,避免无效扩容。

从类图可看出在存储结构中 ConcurrentHashMap 比 HashMap 多出了一个类 Segment,而 Segment 是一个可重入锁。ConcurrentHashMap 是使用了锁分段技术来保证线程安全的。

锁分段技术:
首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据仍能被其他线程访问。

ConcurrentHashMap 提供了与 Hashtable 和 SynchronizedMap 不同的锁机制。Hashtable 中采用的锁机制是一次锁住整个 hash 表,从而在同一时刻只能由一个线程对其进行操作;而 ConcurrentHashMap 中则是一次锁住一个桶。

ConcurrentHashMap 默认将 hash 表分为16个桶,诸如 get、put、remove 等常用操作只锁住当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。

三、Hashtable (线程安全)

  • 底层采用数组+链表实现。key 和 value 都不能为 null。实现线程安全的方式是在修改数据时锁住整个 Hashtable,效率低。
  • 初始 size 为11,扩容:newsize = oldsize*2+1
  • 计算 index 的方法:index = (hash & 0x7FFFFFFF) % tab.length

#四、hash表的属性:加载因子/负载极限

1️⃣HashMap 和 Hashtable 都是用 hash 算法来决定其元素的存储,因此HashMap 和 Hashtable 的 hash 表包含如下属性:
①容量(capacity):hash 表中桶(buckets)的数量;图中的标有0、1、2、3 … 11所对应的数组空间就是一个个桶。
②初始化容量(initial capacity):创建 hash 表时桶的数量,HashMap 允许在构造器中指定初始化容量;
③尺寸(size):当前 hash 表中记录的数量;
④加载因子(load factor):加载因子等于“size/capacity”。加载因子为0,表示空的hash表,0.5表示半满的散列表,依此类推。轻负载的散列表具有冲突少、适宜插入与查询的特点(但是使用Iterator迭代元素时比较慢)。
除此之外,hash表里还有一个“负载极限”,“负载极限”是一个0~1的数值,“负载极限”决定了hash表的最大填满程度。当hash表中的加载因子达到指定的“负载极限”时,hash表会自动成倍地增加容量(桶的数量),并将原有的对象重新分配,放入新的桶内,这称为rehashing。
加载因子:为了降低哈希冲突的概率,默认当HashMap中的键值对达到数组大小的75%时,即会触发扩容。因此,如果预估容量是75,即需要设定75/0.75=100的数组大小。
⑤哈希冲突:若干Key的哈希值按数组大小取模后,如果落在同一个数组下标上,将组成一条Entry链,对Key的查找需要遍历Entry链上的每个元素执行equals()比较。
⑥空间换时间:如果希望加快Key查找的时间,还可以进一步降低加载因子,加大初始大小,以降低哈希冲突的概率。

HashMap 和 Hashtable的构造器允许指定一个负载极限,HashMap 和 Hashtable默认的“负载极限”为0.75,这表明当该hash表的3/4已经被填满时,hash 表会发生 rehashing。

2️⃣**“负载极限”值可以根据实际情况来调整,默认值(0.75)是时间和空间成本上的一种折中:**

  • 较高的“负载极限”可以降低 hash 表所占用的内存空间,但会增加查询数据的时间开销,而查询是最频繁的操作。HashMap 的 get() 与 put() 都要用到查询
  • 较低的“负载极限”会提高查询数据的性能,但会增加 hash 表所占用的内存开销。

3️⃣影响 HashMap 性能的两个因素:哈希表中的初始化容量(桶的数量)和加载因子
当哈希表中条目数超过了当前容量与加载因子的乘积时,哈希表将会作出自我调整,将容量扩充为原来的两倍,并且重新将原有的元素重新映射到表中,这一过程成为 rehash。rehash 操作是会造成时间与空间的开销的,因此初始化容量与加载因子会影响 HashMap 的性能。

Cadence 16.6与17.4双版本共存避坑指南:从安装顺序到环境变量配置 本文是一份详细的Cadence 16.6与17.4双版本共存实战指南。针对硬件工程师和PCB设计者同时处理新旧项目的需求,文章深入剖析了版本冲突根源,并提供了从安装顺序、环境隔离到故障排查的完整解决方案。核心在于通过环境变量精细化管理与脚本控制,实现两个版本的稳定共存与无缝切换,有效解决了文件关联混乱、交互布局失效等常见问题。 阅读详情

相关推荐

[0352]基于JAVA的停车场收费智慧管理系统的设计与实现

其次,从经营管理层面考虑,本系统涵盖了丰富的月卡管理和财务结算功能,如月卡用户管理、缴费、注销、挂失、解挂、补办等全流程服务,以及临保和月保的结算汇总与欠费查询等功能,这不仅有助于规范停车场的日常运营管理,更能有效提高财务管理效率,降低运营成本,实现精细化、数字化的财务管控。综上所述,本课题计划研发的基于Java的停车场收费智慧管理系统将在现有研究成果的基础上,重点优化月卡用户全生命周期管理和财务统计分析功能,以满足现代停车场高效、精准、安全的管理需求,紧跟行业发展趋势,为推动智慧城市的建设贡献一份力量。

muyu2980的专栏 589

ConcurrentHashMap与HashTable

HashTable 与 ConcurrentHashMap 的区别,ConcurrentHashMap实现原理

a141210104的专栏 3551

R语言影像组学实战:从医学图像到预测模型的完整流程(附代码)

本文详细介绍了使用R语言进行影像组学分析的完整实战流程。从环境搭建、数据准备,到医学图像的特征提取与筛选,再到利用机器学习构建预测模型并进行评估,提供了清晰的步骤和可运行的R代码示例,帮助研究者和数据分析师掌握从医学图像到临床预测模型的核心技术。

qsc901234的博客 732

HashMap,Hashtable,ConcurrentHashMap

Hashtable、ConcurrentHashMap和HashMap之间的一些区别。

weixin_56738054的博客 1535

MATLAB实战:5步搞定铣削稳定性叶瓣图(附完整代码解析)

本文提供了一份基于MATLAB的铣削稳定性叶瓣图实战指南。通过5个清晰步骤,从动力学原理出发,详细解析了利用半离散法构建稳定性判据、模块化代码设计、高效参数扫描及高级可视化的完整流程,并附有完整代码,帮助工程师快速预测和规避加工颤振,优化铣削工艺参数。

weixin_29197051的博客 193

MobaXterm破解14个会话限制的保姆级教程(附Python环境配置指南)

本文提供了MobaXterm破解14个会话限制的详细教程,并深入讲解了如何配置稳定的Python环境以支持相关脚本运行。通过理解软件授权机制、安全实践步骤以及许可文件的应用,帮助用户解除会话数量限制,实现高效的远程服务器管理与自动化运维。

weixin_29211309的博客 1627

HashTable HashMap ConcurrentHashMap 的介绍以及区别

本文主要是介绍HashMap HashTable 以及ConcurrentHashMap三者,以及这三者之间的区别

qq_54469537的博客 1819

VFIO框架源码分析(二十一)- IOMMUFD 模式下的 DMA 映射机制

在虚拟化 I/O 的世界里,无论上层管理面(如对象模型、设备绑定)如何重构,数据面最核心的任务始终未变——DMA 映射(DMA Mapping)。即如何建立 Guest Physical Address (GPA) 到 Host Physical Address (HPA) 的映射关系,并将其填入 IOMMU 的硬件页表中,使得直通设备能够正确访问虚拟机内存。在 Legacy VFIO (Type1) 时代,这一职责由承担,它通过ioctl 操作 Container。

qq_36071928的博客 1006

ConcurrentHashMap 和 Hashtable 的区别

Hashtable是 Java 中最早引入的线程安全的Map实现之一。Hashtable是通过对整个映射表进行同步来实现线程安全的,即所有对Hashtable的读写操作都被同步在同一个锁上。这样虽然保证了线程安全性,但也导致了严重的性能瓶颈,尤其是在多线程环境下,当多个线程同时访问Hashtable时,由于锁的争用,性能会显著下降。和Hashtable都是用于实现线程安全的Map线程安全机制Hashtable采用简单的全表同步机制,而则采用分段锁和 CAS 操作,锁的粒度更细,并发性能更高。性能。

Flying_Fish_roe的博客 1747

支付宝h5参数如何实现跳转?(包含相关Demo代码)

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 3241

Bert+CNN文本分类(含代码实现)

一、什么是CNN? CNN的特点: (1)特定特征位移不变性 (2)特征缩放不变性 2. CNN模型构造过程 2.1 Convolution(卷积) (1)获取关键特征(减少参数) (2)共享权重(再次减少参数) 2.2 Max Pooling(池化) 2.3 Flatten 向量转换为如图所示可以进入全连接层的向量模式 3. TextCNN 上图可理解为: 通过不同的size(如上图2、3、4等),上图红色代表 size=2,黄色...

Python,数据分析,机器学习,深度学习 1万+

HashMap、Hashtable和ConcurrentHashMap的区别?

HashMap:非线程安全,适合单线程或自行处理同步的场景,允许null键和值。Hashtable:线程安全,但性能较差,已经不推荐使用,不允许null键和值。:线程安全,采用分段锁机制,适合高并发场景,不允许null键和值,性能优于Hashtable。是现代 Java 开发中并发场景下的最佳选择,它结合了高性能和线程安全的优点,在高并发环境下提供了优异的表现。

m0_73154147的博客 1869

大数据架构中的数据治理:元数据管理与数据血缘追踪实践

本文将聚焦大数据架构中数据治理的两大核心支柱——元数据管理与数据血缘追踪元数据管理的目标、类型与实施步骤(从需求分析到工具落地);数据血缘追踪的技术实现(静态解析、动态捕获、混合方案)与应用场景;如何将两者结合,构建完整的数据治理体系,并通过真实案例展示落地效果。元数据管理:定义了业务/技术/操作元数据,讲解了工具选型(如Apache Atlas)、采集(Hook/API)、存储(关系库+图数据库)、应用(数据发现、质量监控);数据血缘追踪。

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 866

ConcurrentHashMap、HashMap和HashTable

ConcurrentHashMap、HashMap和HashTable的底层实现、区别以及扩容原理

qw2869534823的博客 1675

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

HashTable·HashMap·ConcurrentHashMap 之间的区别

HashMap是基于哈希表实现的,通过哈希函数将键映射到索引位置,实现快速查找。与HashTable不同,HashMap允许使用null作为键和值。HashMap不是线程安全的,因此在多线程环境下使用时需求注意数据一致性问题。1.2工作原理与实现HashMap使用哈希函数将键转换为索引,该函数需要满足确定性,高效性和散列性。采用链地址法处理哈希冲突,即多个键哈希到同一个索引时,它们会被链接到一个链表中。

2302_81921490的博客 891

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Hashtable,HashMap,ConcurrentHashMap之间的区别

本文对比分析了Hashtable、HashMap和ConcurrentHashMap的核心特性。Hashtable采用全局锁保证线程安全但性能低;HashMap非线程安全但单线程性能优异;ConcurrentHashMap通过细粒度锁机制实现高并发性能。三者在空值支持、继承关系等方面也存在差异:Hashtable和ConcurrentHashMap不允许null键值,而HashMap允许;继承关系上分别源自Dictionary、AbstractMap等不同父类。使用场景建议:单线程用HashMap,高并发用

huohaiyu的博客 861

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

HashMap、HashTable、ConcurrentHashMap详解

HashMap 是 Java 集合框架中最常用的非线程安全哈希表,实现了Map接口,基于 “数组 + 链表 / 红黑树” 的混合结构(JDK 1.8 优化),核心目标是高效查询、插入、删除(理想时间复杂度 O (1))。// 核心继承关系HashTable 是 Java 早期提供的线程安全哈希表,实现了Map接口,底层结构与 JDK 1.7 的 HashMap 类似(数组 + 链表,无红黑树优化),但因性能低下,目前已被替代,仅在遗留系统中可能见到。// 核心继承关系。

qq_74156239的博客 791

HashMap、Hashtable、ConcurrentHashMap的区别

HashMap、Hashtable、ConcurrentHashMap是日常开发中使用频率较高的数据结构,它们都是以key-value的形式来存储数据,且都实现了Map接口,日常开发中很多人对其三者之间的区别并没有十分清晰的概念。本文将剖析部分源码,以及从线程安全性、速度等方面来分析三者之间的区别。首先讲下三者的一些区别:1.HashMap与Hashtable基本上等价,区别在于Hashtable的大部分方法都是被synchronized修饰,并且键值都不能为null(HashMap则可以);...

qq_33479841的博客 6064

HashMap和Hashtable的key和value可以为null吗,ConcurrentHashMap呢

HashMap的key可以为null,value也可以为null;Hashtable的key不允许为null,value也不能为null;ConcurrentHashMap的key不允许为null,value也不能为null;HashMap可以存储一个Key为null,多个value为null的元素;但是Hashtable不可以存储

qq_44700578的博客 1541

HashMap、HashTable、ConcurrentHashMap 之间的区别

哈喽,大家好~我是保护小周ღ,本期为大家带来的是 HashMap、HashTable、ConcurrentHashMap 之间的区别,从数据结构到多线程安全~确定不来看看嘛~ 更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘

保护小周ღ的博客 2905

HashMap、hashTable、ConcurrentHashMap的区别

文章目录1. HashMap2. HashTable3. ConcurrentHashMap4. 三者区别 1. HashMap 是一个散列图,存储的内容是键值对映射 hashMap:(java 8 以前):数组+ 链表,结合了两者的优势。操作是非sychronized,效率比较高,默认长度为16,每个数组元素中存储的是链表的头节点。通过位运算获取要存放的位置。最坏情况O(1)-> O(n),运行插入null的值 hashmap java8以后采用:数组+链表+红黑树,使用一个常量:TREEIFY_

mercies的博客 216

HashMap、HashTable、ConcurrentHashMap简述

HashMap: JDK1.7中使用一个Entry数组来存储数据,用key的hashcode取模来决定key会被放到数组里的位置,如果hashcode取模结果相同,那么这些key会被定位到Entry数组的同一个格子里,这些key会形成一个链表 JDK1.8中使用一个Node数组来存储数据,但这个Node可能是链表结构,也可能是红黑树结构,如果插入的key的hashcode取模结果相同,那么这些...

Ehine_N的博客 226

Hashtable、HashMap以及ConcurrentHashMap之间的区别

ConcurrentHashMap与Hashtable,HashMap之间的区别

weixin_41965831的博客 498

HashTable、HashMap、ConcurrentHashMap 区别总结

完全非线程安全。在多线程环境下进行并发修改(如同时 put 或扩容)可能导致数据不一致、死循环(JDK 1.7 及之前)等问题。需要通过外部同步(如 Collections.synchronizedMap () 或手动加锁)才能在多线程环境中安全使用。:线程安全,但实现方式较为粗暴。它通过在几乎所有公开方法上加关键字实现同步,这意味着每次操作都需要获取整个对象的锁,极大限制了并发性能。:线程安全且并发性能优异。

2303_81937027的博客 684

HashMap HashTable ConcurrentHashMap区别

本文转载自https://blog.youkuaiyun.com/qinning199/article/details/43488961 1. Hashtable 和 HashMap (1)区别,这两个类主要有以下几方面的不同: Hashtable和HashMap都实现了Map接口,但是Hashtable的实现是基于Dictionary抽象类。 在HashMap中,null可以作为键,这样的键只有一个;...

Shawn的博客 148

HashMap、ConcurrentHashMap、HashTable

三者都是Map结构,具体有什么不同呢?

unstoppable_t的博客 192
上一篇: List 和 Map 的深浅克隆
下一篇: 为何 HashMap 非线程安全
JFS_Study
博客等级 码龄6年 363粉丝 359原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值