总结 HashTable, HashMap, ConcurrentHashMap 之间的区别

news2024/11/17 23:56:58

1.多线程环境使用哈希表

HashMap 不行,线程不安全

更靠谱的,Hashtable,在关键方法上加了synchronized

后来标准库又引入了一个更好的解决方案;ConcurrentHashMap

2.HashMap

  • 首先HashMap本身线程不安全
  • 其次HashMap的key值可以为空(当key为空时,哈希会被赋值为0

3.Hashtable

这相当于直接针对Hashtable对象本身加锁

 如果访问同一个Hashtable就直接造成锁冲突

 size属性也是通过synchronized来控制同步,也是比较慢的

  一旦触发扩容,就由该线程完成整个扩容工作,这个过程会涉及大量的元素拷贝,效率会非常低

4.ConcurrentHashMap

改进

1)缩小了锁的粒度

2)充分的使用CAS原子操作,减少一些加锁

3)优化了扩容⽅式:化整为零
◦ 发现需要扩容的线程,只需要创建⼀个新的数组,同时只搬⼏个元素过去.
◦ 扩容期间,新⽼数组同时存在.
◦ 后续每个来操作ConcurrentHashMap的线程,都会参与搬家的过程.每个操作负责搬运⼀⼩部
分元素.
◦ 搬完最后⼀个元素再把⽼数组删掉.
◦ 这个期间,插⼊只往新数组加.
◦ 这个期间,查找需要同时查新数组和⽼数组

注;

HashMap 的扩容操作是一把梭 在某一次插入元素操作中,整体完成扩容

ConcurrentHashMap 则是每次操作都只搬运一部分元素

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

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

相关文章

FNM和SFNM的区别

看图说话。 级联模式下,FNM模式,从片的中断都是同一个级别,因此从片如果有多个中断发生,中断之间不会抢占,只能按顺序处理。 级连模式下,SFNM模式,从片中断有优先级的区别,高优先级…

Qt外部调用进程类QProcess的使用

有的时候我们需要在自己程序运行过程中调用其他进程,那么就需要用到QProcess。 首先可以了解一些关于进程的相关知识:线程与进程,你真得理解了吗_进程和线程的区别-CSDN博客 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0…

7.1.1 selenium介绍及安装chromedriver

目录 1. Selenium的用途 2. 安装Selenium库 3. 安装chromedriver 1. 查看谷歌版本号​编辑 2. 找到最新版本及下载 3. 配置环境变量 4. 检测是否配置成功 5. 用python初始化浏览器对象检测: 6. 参考链接 1. Selenium的用途 在前面我们提到:在我…

NIO核心三:Selector

一、基本概念 选择器提供一种选择执行已经就绪的任务的能力。selector选择器可以让单线程处理多个通道。如果程序打开了多个连接通道,每个连接的流量都比较低,可以使用Selector对通道进行管理。 二、如何创建选择器 1.创建Selector Selector select…

ArduinoTFTLCD应用

ArduinoTFTLCD应用 ArduinoTFTLCD应用硬件连接软件导入库显示数字、字符显示汉字方案1方案2 显示图片 总结 ArduinoTFTLCD应用 对于手工喜欢DIY的人来说,Arduino驱动的TFTLCD被很多人使用,此处就总结一下,使用的是VScode的PlatformIO插件驱动…

Docusaurus框架——react+antd+echarts自定义mdx生成图表代码解释文档

文章目录 ⭐前言⭐Docusaurus框架渲染mdx内容💖 创建一个mdx文件💖 创建一个react jsx文件💖 mdx引入react的组件并渲染💖 mdx引入react的组件源代码内容 ⭐渲染一个echarts地图的代码解释文档💖 echarts 渲染地图&…

USLE模型-P因子的计算

首先需要下载土地利用类型数据集,查看我的相关文章 对于已有的10种土地类型代码,需要按水土保持措施P值表进行重分类。 10是耕地,且庆阳市坡度10-15度左右,所以赋给了3(最好再下个DEM计算一下,这里就统一用…

WebServer -- 注册登录

目录 🍉整体内容 🌼流程图 🎂载入数据库表 提取用户名和密码 🚩同步线程登录注册 补充解释 代码 😘页面跳转 补充解释 代码 🍉整体内容 概述 TinyWebServer 中,使用数据库连接池实现…

C++指针(三)

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 文章目录 前言 1.字符指针 1.1字符指针的概念 1.2字符指针的用处 1.3字符指针的操作 1.3.1定义 1.3.2初始化 1.4字符指针使用注意事项 2.数组参数,指针参数 2.1数组参数 2.1.1数组参数的概念 2.1…

NCT 全国青少年编程图形化编程(Scratch)等级考试(一级)模拟测试H

202312 青少年软件编程等级考试Scratch一级真题 第 1 题 【 单选题 】 以下说法合理的是( ) A :随意点开不明来源的邮件 B :把密码设置成 abc123 C :在虚拟社区上可以辱骂他人 D :在改编他人的作品前, 先征得他人同意 正确答案: D 试题解析&…

python模块和包概念与使用

python模块和包概念与使用 Python模块与包的关键概念 在Python编程中,模块和包是代码组织和管理的基石。以下是关于Python模块与包的核心要点: 模块: 模块是一个包含Python代码的.py文件,它可以定义函数、类、变量等。通过导入模…

水经微图Web版1.6.0发布

让每一个人都有自己的地图! 水经微图(简称“微图”)新版已上线,在该版本中主要新增了点线面图层分组样式设置、图层排序并按序绘制、KML支持矢量符号的存储、KML支持态势标绘要素存储和新增历史地图文本样式等。 现在&#xff0…

Leetcoder Day27| 贪心算法part01

语言:Java/Go 理论 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 什么时候用贪心?可以用局部最优退出全局最优,并且想不到反例到情况 贪心的一般解题步骤 将问题分解为若干个子问题找出适合的贪心策略求解每一个子…

使用plasmo框架开发浏览器插件,注入contents脚本和给页面添加UI组件

plasmo:GitHub - PlasmoHQ/plasmo: 🧩 The Browser Extension Framework plasmo是一个开发浏览器插件的框架,支持使用react和vue等技术,而且不用手动管理manifest.json文件,框架会根据你在框架中的使用,自…

美团分布式 ID 框架 Leaf 介绍和使用

一、Leaf 在当今日益数字化的世界里,软件系统的开发已经成为了几乎所有行业的核心。然而,随着应用程序的规模不断扩大,以及对性能和可扩展性的需求不断增加,传统的软件架构和设计模式也在不断地面临挑战。其中一个主要挑战就是如…

SAP EC-CS如何实现自动抵消

SAP EC-CS 是SAP 比较早的合并方案,尽管后面有很多其他的方案作为替代,但 EC-CS 因为其成熟性,在集团合并单元不多的情况下,也可以作为一个不错的合并解决方案。可以说,会计报表合并一个核心就是实现抵消的处理&#x…

nginx------------缓存功能 ip透传 负载均衡 (六)

一、http 协议反向代理 (一)反向代理示例:缓存功能 缓存功能可以加速访问,如果没有缓存关闭后端服务器后,图片将无法访问,缓存功能默认关闭,需要开启。 ​ proxy_cache zone_name | off; 默认off #指明调…

2024全新手机软件下载应用排行、平台和最新发布网站,采用响应式织梦模板

这是一款简洁蓝色的手机软件下载应用排行、平台和最新发布网站,采用响应式织梦模板。 主要包括主页、APP列表页、APP详情介绍页、新闻资讯列表、新闻详情页、关于我们等模块页面。 地 址 : runruncode.com/php/19703.html 软件程序演示图:…

C语言中的字符魔法:大小写转换的艺术

引言 在C语言的世界里,字符处理是一项基础且重要的任务。字符作为编程中最基本的元素之一,承担着信息展示、数据交互等多重角色。特别是在处理文本信息时,字符的转换和识别显得尤为重要。大小写字母的转换就是其中一个常见的需求&#xff0c…

串及BF朴素查找算法(学习整理):

关于串的相关定义: 串:用‘ ’表示的字符序列空串:包含零个字符的串子串:包含传本身和空串的子串 eg: abc(,a,b,c,ab,bc,ac,abc)共7个:串的长度的阶乘1(空串)真子串:不包含自身的所…