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》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、单词搜索二、黄金矿工三、不同路径 |||四、图像渲染五、岛屿数量六、岛屿的最大面积七、被围绕的区域…

机器学习之sklearn基础教程(第二篇:数据预处理与特征工程)

机器学习之sklearn基础教程(第二篇:数据预处理与特征工程) 1. 数据预处理 数据预处理是机器学习中非常重要的一步,它包括对原始数据进行清洗、变换和归一化等操作,以使数据更适合用于机器学习模型的训练和预测。 以下…

冲!哪怕公域拓展流量超卷,数字化转型营销也勇往直前!

在这个数字时代,公域拓展流量的竞争已经激烈到令人咋舌的程度!然而,开利网络蚓链数字化转型营销解决方案经过上千家客户实践告诉我们,即使面对如此残酷的局面,我们也必须勇敢地去面对,利用想得到的合规合法…

三磷酸腺苷(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 支持多国语言,英文、中文都能正确理解…

盘点Lombok的几个骚操作,你绝对没用过

本文不讨论对错,只讲骚操作。 有的方法看看就好,知道可以这么用,但是否应用到实际开发中,那就仁者见仁,智者见智了。 一万个读者就会有一万个哈姆雷特,希望这篇文章能够给您带来一些思考。 耐心看完&…

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

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

STM32 HAL TM1637使用

TM1637属于一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路。 本文主要使用MCU是STM32 ,CubeMXKeil5进行开发,使用HAL库 简介:TM1637可以带动16个按键以及做数码管驱动 TM1637.C #include "TM163…

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

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

力扣127.单词接龙讲解

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

C++14 新特性:函数返回值类型推导

C11 的特性介绍暂时告一段落,从今天起,我继续介绍 C14 引入的新特性。 C14 进一步增强了 C11 的特性,其中一个改进是对函数返回值类型的自动推导能力的扩展。在 C14 中,编译器可以根据函数返回语句推导出函数的返回类型。 函数返…

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

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

在win10折腾Flowise:部署和尝试

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

McCabe度量法

McCabe度量法,又称为环路度量(Cyclomatic Complexity)或循环复杂度,是由Thomas J. McCabe Sr.在1976年提出的一种用于软件工程中的程序复杂性度量方法。这种方法基于程序的控制流图(Control Flow Graph, CFG&#xff0…

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…

【Daily Code】1953. 你可以工作的最大周数1974. 使用特殊打字机键入单词的最少时间

Problem: 1953. 你可以工作的最大周数 Code class Solution { public:long long numberOfWeeks(vector<int>& milestones) {// 自己想的思路是每次取出那个剩余时间最多的任务来做&#xff08;但是注意不能连着两次都取到同一个任务来做&#xff09;&#xff1b;然后…

震惊!三张图搞定企业数字化转型?开利蚓链就是这么简单!

企业数字化转型&#xff0c;听起来似乎很复杂&#xff0c;让人望而却步&#xff1f;别急&#xff01;开利蚓链数字化生态解决方案告诉你&#xff0c;只需三张图&#xff0c;就能轻松搞定开局&#xff01;一张组织目标图&#xff0c;一张市场路径图&#xff0c;一张权益分配图&a…