HashTable, HashMap, ConcurrentHashMap 三者区别

目录

1. HashMap

2. HashTable 

3. ConcurrentHashMap 

1. HashMap

    HashMap 是 Java 中非常常用的一个数据结构,它主要用于存储 键值对(K,V)。

    在JDK 1.7中,HashMap的实现是基于 Table数组 和 Entry链表 的组合。

      

    从JDK 1.8开始,为了解决链表过长导致的性能问题,当链表长度超过一定阈值时,链表会转换为红黑树。

    特点:

  (1)HashMap 允许使用 null 作为 键(K)或值(V),但是最多只能有一个键为null

  (2)在单线程下,HashMap 是不需要关心线程安全问题的; 但是在多线程下,HashMap就不是线程安全的,因为 它没有任何加锁的操作来 保证线程安全 。

    所以,HashMap 只能在单线程线程安全下执行,但如果我们想在多线程下进行呢?

    此时我们就需要了解一下 HashTable 。

2. HashTable 

     HashTable不允许键为null,但允许值为null。

     HashTable 为保证多线程情况下 是线程安全的,就给整个链表 加入 一把大锁(如下图)。

    如果加一把大锁,那多个线程 现在同时操作 这个 HashTable 的时候,当某个线程在操作的时候,其他线程就只能干等着, 这大大影响了整体的效率

    那有没有 更好的加锁方式来解决这个问题的呢?

    接下来来看 ConcurrentHashMap 。

3. ConcurrentHashMap 

    ConcurrentHashMap 是基于 HashTable 的基础上 将一把大锁 分解到 对数组中每个链表 进行加锁,这样,当我们同时操作 HashMap 中的不同链表中的数据时候,就可以在不影响 线程安全的情况下,将效率进一步 提高了。

   

    ConcurrentHashMap 特点

    (1) ConcurrentHashMap 最核心的改进就是,将一个全局的大锁,改进成 每个链表独立的小锁,这样就大大降低了 锁冲突 的概率

    (2)  ConcurrentHashMap 它还 充分利用到了 CAS 的特性, 将 一些不必要的加锁环节给省略加锁了。

    例如, 需要用变量记录 hash 中的元素个数。

    (3) ConcurrentHashMap 还有一个激进的操作,对读操作没有加锁

    读和读,读和写之间,都不会有锁竞争,

    那有没有可能出现 “ 读到一个修改了一半的值呢”:

    答案是不会,这是因为 ConcurrentHashMap 在底层编码中,谨慎的处理了一些细节,修改的时候,会避免使用一些 非原子的操作,所以 读的时候,要么 读的是修改之前的值,要么是读的修改之后 的值。

    (4) ConcurrentHashMap 针对扩容操作,做了单独的优化

    HashTable 以及 HashMap 在进行扩容的时候,都是将 所有元素进行拷贝一份,这样一来,就会在扩容的 时候 出现卡顿。

    而 ConcurrentHashMap 不会,它在扩容 过程中,并不是一次将所有的元素进行拷贝,而是分成多份进行 分批 搬运,每次只搬运 部分 数据,这样就避免了卡顿。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 pyGTK 中使用 visibility_notify 事件

问题背景 在 Windows 系统中开发 pygtk 应用程序时,需要知道何时一个窗口被另一个窗口遮挡或显示,以便停止繁重的绘图进程。为此,可以使用 visibility_notify_event 信号来获取窗口可见性状态的改变。 解决方案 可以使用 visibility_notif…

【Linux】缓冲区

目录 一、初识缓冲区 二、用户级缓冲区 三、内核级缓冲区 四、内核级缓冲区 VS 用户级缓冲区 五、用户级缓冲区在哪里? 一、初识缓冲区 缓冲区是什么?可以简单理解成一部分内存。例如用户缓冲区(char arr[])、C标准库提供的缓冲区、操作系统提供的缓…

【算法】网络图中的dfs

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、单词搜索二、黄金矿工三、不同路径 |||四、图像渲染五、岛屿数量六、岛屿的最大面积七、被围绕的区域…

三磷酸腺苷(ATP)制备方法众多 主要应用于生化研究以及医药领域

三磷酸腺苷(ATP)制备方法众多 主要应用于生化研究以及医药领域 三磷酸腺苷(ATP)又称腺嘌呤核苷三磷酸、腺苷三磷酸,化学式为C10H16N5O13P3,是一种高能磷酸化合物。腺苷三磷酸外观呈白色粉末,无特…

2025秋招Java还是c++?

一、我的编程经 说说我的编程经历,在C和Java之间我经历了几个阶段: 大学期间,我浅尝辄止地学习了一段时间的Java,但后来放弃了,开始学习C/C。本科毕业后,我选择攻读硕士学位,并一直专注于C的学…

集成了Gemini的Android Studio,如虎添翼

今天将Android Studio升级到最新版(Jellyfish)。发现在new features中有一条: Code suggestions with Gemini in Android Studio 打开路径为: View > Tool Windows > Gemini 支持多国语言,英文、中文都能正确理解…

PPT为何无法复制粘贴?附解决办法!

PPT文件里的内容无法复制,或者复制后无法粘贴,这是怎么回事呢? 这种情况,一般是因为PPT被设置了保护,设置了以“只读方式”打开,就无法进行复制粘贴了。PPT的“只读方式”不同,解决方法也不同&…

Java入门基础学习笔记25——死循环和循环嵌套

死循环: 可以一直执行下去的一种循环,如果没有干预不会停下来。 死循环的写法: 例: package cn.ensource.loop;public class EndLessLoopDemo5 {public static void main(String[] args) {// 目标;掌握死循环的写法w…

力扣127.单词接龙讲解

距离上一次刷题已经过去了.........嗯............我数一一下............整整十天,今天再来解一道算法题 由于这段时间准备简历,没咋写博客。。今天回来了!!!!!!!&…

【React】如何让函数式组件也能使用state——useState(Hooks)

React的函数式组件不同于类式组件,函数式组件没有自己的 this,看似没有操作state的能力 但是React官方提供了一个Hooks叫useState,它解决了函数式组件和类式组件的差异,让函数式组件拥有了类式组件所拥有的 state ,同时…

在win10折腾Flowise:部署和尝试

Flowise 是一种低代码/无代码拖放工具,旨在让人们轻松可视化和构建 LLM 应用程序。 本地部署 操作系统: win10 由于网络、操作系统等各种未知问题,使用npm install -g flowise的方式,尝试了很多次,都没有部署成功&am…

Visual C++界面开发组件Xtreme Toolkit Pro v24测试版发布——完全支持SVG

Codejock软件公司的Xtreme Toolkit Pro是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Repo…

位图和布隆过滤器:位图

在《unordered_map 和 unordered_set》 中提到过: 哈希是一种思想,通过哈希函数将数据转化为一个或多个整型 —— 映射关系;通过这种映射关系,可以做到以 O(1) 的时间复杂度查找数据。 本文即将介绍的 位图 和 布隆过滤器 就是两个…

专“蜀”盛会!CGT Asia 2024 第六届亚洲细胞与基因治疗创新峰会(成都站)7月火热相邀

在细胞与基因治疗领域,我们正站在一个科技革命的风口上。中国的CGT市场预计将持续快速增长。根据相关分析,预计到2025年整体市场规模将达到25.9亿美元,显示出276%的复合年增长率。这一增长趋势预计将持续到2030年,细胞与基因治疗领…

【前端】TypeScript--未整理

概念 安装 npm install -g typescript 检查版本 tsc -v tsc 类型

redis-stack部署概要

第一步,下载redis-stack 下载链接:Downloads - Redis 第二步,redis安装包解压缩 gzip -d redis-stack-server-7.2.0-v10.rhel8.x86_64.tar.gz tar -xvf redis-stack-server-7.2.0-v10.rhel8.x86_64.tar 第三步,编辑etc下的redis…

IC设计企业如何实现安全便捷的芯片云桌面跨网摆渡?

IC设计企业,主要专注于集成电路的设计。这些企业通常包括集成电路、二极管、三极管和特殊电子元件等产品的设计和生产。IC设计企业在其运营和产品设计过程中,会涉及和产生多种文件,如: 项目需求文档:这是项目启动的基础…

停车场车位引导管理系统工作原理是什么,由哪些软硬件设备组成?

在现代城市中,随着汽车保有量的持续增长,停车难成为了许多城市面临的共同问题。有效管理停车场资源,提高车位利用率,减少寻找停车位的时间,对于缓解交通拥堵、提高城市运行效率具有重要意义。车位引导管理系统正是为了…

谷歌举办Gemini API开发者大赛;ChatGPT iOS版更新支持中文

🦉 AI新闻 🚀 谷歌举办Gemini API开发者大赛,大奖1981款电动DeLorean 摘要:IT之家 5 月 15 日消息,在 2024 年谷歌 I/O 开发者大会上,谷歌宣布举办 Gemini API 开发者大赛,主要面向个人开发者…

24长三角数学建模ABC题已出!!!

需要ABC题资料的宝子们可以进企鹅 赛题如下: 赛道 A:“抢救”落水手机 上有天堂,下在苏杭;五一假期,杭州西湖、西溪湿地、京杭大运河等著名 景点,游人如织,作为享誉国内外的旅游胜地&#xff0…