news 2026/8/6 4:47:27

HashMap、HashTable、ConcurrentHashMap详细区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HashMap、HashTable、ConcurrentHashMap详细区别

📚 目录

  • 1. 全方位对比表格
    • 1.1 线程安全与锁机制
    • 1.2 null‑value规则
    • 1.3 默认容量、扩容、底层数据结构
  • 2. 底层细节区分
    • 2.1 HashTable为什么现在不推荐使用?
    • 2.2 ConcurrentHashMap相较于HashTable优势
  • 3. 面试高频问答题库

前言:
本篇文章专注剖析 HashMap、HashTable、ConcurrentHashMap 的底层差异、版本迭代细节、并发坑点以及面试考点,适合用来复盘Java并发集合知识。

1. 全方位对比表格

1.1 线程安全与锁机制
容器线程安全性上锁原理
HashMap非线程安全没有添加任何锁;多线程并发编程中写入会产生数据覆盖、环形链表等问题
HashTable线程安全所有读和写的方法添加了synchronized,锁住整张哈希表对象,全局独占锁,并发的性能较差
ConcurrentHashMap线程安全采用桶头结点锁+CAS的方式;仅锁住当前正在操作的数组桶,其余桶可以多线程同时读写
1.2 null‑value规则
  1. HashMap: 允许使用1个null来作为主键,可以存放多个null值
  2. HashTable: K,V两个值都禁止使用null值,否则编译器会抛出NullPointerException异常

例如:

3. ConcurrentHashMap: 同样K,V值不支持使用null,否则抛出NullPointerException异常

1.3 默认容量、扩容、底层数据结构
  1. HashMap
  • 初始容量为16,
  • 负载因子0.75,
  • 扩容方式采用2倍扩容
  • 当满足条件时,链表会转化成红黑树
  1. HashTable
  • 初始容量:11
  • 负载因子:0.75
  • 扩容规则:newCapacity = oldCapacity * 2 + 1
  • 不会转化成红黑树
  1. ConcurrentHashMap
  • 初始容量:16
  • 负载因子:0.75
  • JDK8中依旧只有数组和链表的形式,不会转化成红黑树JDK8以后,ConcurrentHashMap具备转化成红黑树的能力;
🔙 返回目录




2. 底层细节区分

2.1 HashTable为什么现在不推荐使用?

上诉谈到:HashTable线程安全的,但是在实际开发中并不怎么使用HashTable,理由如下:
假设:我们两个以及以上的线程需要修改很多次HashTable中的数据;

当很多个线程在没有锁的情况下去修改同一个数据的时候,会触发线程安全问题;
此时很多个线程同时操作当前哈希表中相同一个链表的数据,由于有此时不会发生线程安全问题;
但是此时如果很多条线程操作不同链表中的数据,此时这把锁还需要上吗?
我们知道,就算此时就算不加锁,也不会触发线程安全问题,如果链表中有很多数据,另外两条线程拿不到锁就会一直处于阻塞状态,不会执行,就会减少执行的效率

2.2 ConcurrentHashMap相较于HashTable优势

相较于:HashTable,ConcurrentHashMap大幅度提升了执行效率:

  1. JDK7:Segment分段锁
    ConcurrentHashMap采用了给哈希表的每一个节点进行上锁,每一把锁对应不同的链表
    当不同线程去访问不同链表时,不会进行阻塞,访问同一条链表时,就会进行阻塞等待;
  2. JDK8:彻底废弃Segment
    改用Node桶节点锁CAS自旋。当准备修改桶内数据,仅锁住链表头部节点。(CAS自旋,compare and swap,比较并交换,CAS也属于解决线程安全的一种手段,此处不具体讲解CAS);
    好处:锁粒度细化到每一个哈希桶,并发吞吐量大幅度提升。
🔙 返回目录




3. 面试高频问答题库

  1. HashMap 在多线程环境为什么不安全?

JDK7头插法扩容容易产生环形链表,然后就会触发死循环;多个线程同时执行put操作时,会发生value值覆盖丢失。 JDK8改成尾插解决环形链表,但依旧存在并发写入覆盖问题。

  1. ConcurrentHashMap 相较于 HashTable 的性能优势?

HashTable 锁住是整张哈希数组;ConcurrentHashMap 只锁定当前操作的桶结点,其余位置可以并发读写,冲突概率很低,高并发场景性能远超 HashTable。

  1. 为什么 ConcurrentHashMap 的 value 不能等于 null?

并发读取的时候,get (key) 返回 null,你没办法区分是该 key 不存在,还是 key 对应的存储值就是 null。单线程可以二次调用 containsKey 判断,并发情况下两次调用之间数据随时会被别的线程改动,判断失效。

🔙 返回目录




版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 4:45:20

蛋白质语言模型ESM:从Transformer原理到突变预测实战

1. 从序列到功能:蛋白质语言模型的破局之路如果你在生物信息学或者计算生物学领域摸爬滚打过几年,一定会对“蛋白质结构预测”这个老大难问题印象深刻。传统的实验方法,比如X射线晶体衍射或者冷冻电镜,虽然精准,但耗时…

作者头像 李华
网站建设 2026/8/6 4:41:46

ESP32看门狗复位(rst:0x7)深度解析与系统化排查指南

1. 从一串神秘代码说起:ESP32的“看门狗”咬人了如果你正在调试ESP32,突然串口监视器里蹦出来这么一行字:rst:0x7 (TG0WDT_SYS_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT),然后设备就重启了,别慌,你不是一个人…

作者头像 李华
网站建设 2026/8/6 4:40:07

VBF格式深度解析:从二进制结构到嵌入式刷写实践

1. 项目概述:从二进制流到可执行映像的桥梁在嵌入式开发和汽车电子领域,我们经常需要将编译好的程序代码、数据、校准参数等,打包成一个单一的文件,然后通过特定的刷写工具,将其灌入到微控制器(MCU&#xf…

作者头像 李华
网站建设 2026/8/6 4:39:28

2026论文爆款降AIGC网站大曝光:一键抹平AI痕迹稳过知网!

2026年的学术战场早已不是从前的模样,论文审核的门槛被一再抬高,学生们的焦虑点也从“怎么降查重”变成了“怎么躲过AI检测”。随着AI写作工具的普及,高校对论文中AI痕迹的敏感度达到了前所未有的高度。现在的查重系统已经不够用了&#xff0…

作者头像 李华
网站建设 2026/8/6 4:39:00

华为TCX转换器:3步解决运动数据跨平台同步难题

华为TCX转换器:3步解决运动数据跨平台同步难题 【免费下载链接】Huawei-TCX-Converter A makeshift python tool that generates TCX files from Huawei HiTrack files 项目地址: https://gitcode.com/gh_mirrors/hu/Huawei-TCX-Converter 你是否为华为手表记…

作者头像 李华