关于Map类的使用小结

目录

1. 常用Map类和区别

2. HashMap工作原理

2.1 Put()执行过程

2.2 扩容机制

3. ConcurrentHashMap

3.1 工作原理

3.2 JDK7分段锁的优缺点


1. 常用Map类和区别

Map类包含:HashMap、HashTable、LinkedHashMap、TreeMap。

1) 从功能上区分。

  • HashMap:在Map中插入,删除,定位元素。
  • TreeMap:可以按照自定义顺序或自然顺序遍历。
  • LinkedHashMap:要求输入顺序和输出顺序相同。

2) 内部数据结构。

  • HashMap:数组+链表/红黑树。
  • HashTable:数组+链表。
  • LinkedHashMap:双向链表。
  • TreeMap:红黑树。

3) 线程安全性。

  • HashMap:非线程安全。
  • HashTable:线程安全。
  • LinkedHashMap:非线程安全。
  • TreeMap:非线程安全。

2. HashMap工作原理

HashMap是基于哈希算法来确定元素的槽,当我们向集合中存入数据时,它会计算传入的Key的哈希值,并利用哈希值取余来确定槽的位置。

如果元素发生碰撞,也就是这个槽已经存在其他的元素了,则HashMap会通过链表将这些元素组织起来。如果碰撞进一步加剧,某个链表的长度达到了8,则HashMap会创建红黑树来代替这个链表,从而提高对这个槽中数据的查找的速度。

数组的默认初始容量为16,这个容量会以2的指数进行扩容,当数组中的元素达到一定比例的时候HashMap就会扩容,这个比例叫做负载因子,默认为0.75。

2.1 Put()执行过程

1) 判断数组,若发现数组为空,则进行首次扩容。

2) 判断头节点,若发现头节点为空,则新建链表节点,存入数组。

3) 判断头节点,若发现头节点非空,则将元素插入槽内。

  • 若元素的key与头节点一致,则直接覆盖头节点。
  • 若元素为树型节点,则将元素追加到树中。
  • 若元素为链表节点,则将元素追加到链表中。(追加后,需要判断链表长度以决定是否转为红黑树。比如,若链表长度达到8、数组容量未达到64,则扩容。若链表长度达到8、数组容量达到64,则转为红黑树)
  • 插入元素后,判断元素的个数,若发现超过阈值则再次扩容。

2.2 扩容机制

HashMap中添加数据时,有三个条件会触发它的扩容行为:

1) 如果数组为空,则进行首次扩容。

2) 将元素接入链表后,如果链表长度达到8,并且数组长度小于64,则扩容。

3) 添加后,如果数组中元素超过阈值,即比例超出限制(默认为0.75),则扩容。 并且每次扩容时都是将容量翻倍,即创建一个2倍大的新数组,然后再将旧数组中的数组迁移到新数组里。

3. ConcurrentHashMap

3.1 工作原理

JDK7 中的ConcurrentHashMap使用的是Segment和HashEntry。

JDK8 中的ConcurrentHashMap使用的是synchronized和CAS和HashEntry和红黑树。

ConcurrentHashMap和HashMap一样,使用了红黑树,而在ConcurrentHashMap中则是取消了Segment分段锁的数据结构,取而代之的是Node数组+链表+红黑树的结构,使用的 “读写锁”采用了CAS和Synchronized来保证线程的安全。

3.2 JDK7分段锁的优缺点

Segment继承了重入锁ReentrantLock,有了锁的功能,每个锁控制的是一段,当每个Segment越来越大时,锁的粒度就变得有些大了,具体分段数量由concurrencyLevel字段来控制。

1) 优点。

  • 在于保证在操作不同段 map 的时候可以并发执行,操作同段 map 的时候,进行锁的竞争和等待。这相对于直接对整个map同步synchronized是有优势的。

2) 缺点。同时这也是为什么在 JDK8 不在继续使用分段锁的原因。

  • 每个锁控制的是一段,当分段很多,并且加锁的分段不连续的时候,内存空间的浪费比较严重。

  • 操作map时竞争同一个分段锁的概率非常小时,分段锁反而会造成更新等操作的长时间等待。

  • 当某个段很大时,分段锁的性能会下降。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多线程进阶学习11------CountDownLatch、CyclicBarrier、Semaphore详解

CountDownLatch ①. CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞 ②. 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞) ③. 计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行 public static void m…

SpringBoot学习笔记上

文章目录1 SpringBoot1.1 SpringBoot介绍1.2 SpringBoot创建的三种方式1.3SpringBootApplication注解1.4 SpringBoot的配置文件1.5多环境配置1.6 使用jsp1.7 ComnandLineRunner 接口 , ApplcationRunner接口2 Web组件2.1 拦截器2.2 Servlet2.3 过滤器Filter2.4 字符…

gpt3官网中文版-人工智能软件chat gpt安装

GPT-3(Generative Pre-trained Transformer 3)是一种自然语言处理模型,由OpenAI研发而成。它是GPT系列模型的第三代,也是目前最大、最强大的自然语言处理模型之一,集成了1750亿个参数,具有广泛的使用场景&a…

Flutter Row 实例 —— 新手礼包

大家好,我是 17。 本文在 3.31 日全站综合热榜第一。 新手礼包一共 3 篇文章,每篇都是描述尽量详细,实例讲解,包会! Flutter Row 实例 —— 新手礼包Flutter TextField UI 实例 —— 新手礼包Flutter TextField 交…

靠近用户侧和数据,算网融合实现极致协同

游弋自如的生产力,在边缘。IMMENSE、36氪|作者 1846年1月,纽约。 一行长短不一的电码顺着通讯线路飞往130公里开外的费城,这是华尔街的巨头们首次使用电报传输讯息,更具有金钱意味的是,电力通讯的成功&am…

【蓝桥杯集训·周赛】AcWing 第96场周赛

文章目录第一题 AcWing 4876. 完美数一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第二题 AcWing 4877. 最大价值一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第三题 AcWing 4878. 维护数组一、题目1、原…

路由策略实验

运行OSPF协议 [R1]ospf 1 router-id 1.1.1.1 [R1-ospf-1]area 0 [R1-ospf-1-area-0.0.0.0]network 192.168.12.1 0.0.0.0 [R1-ospf-1-area-0.0.0.0]network 192.168.13.1 0.0.0.0 [R2]ospf 1 router-id 2.2.2.2 [R2-ospf-1]area 0 [R2-ospf-1-area-0.0.0.0]network 192.168.…

抖音seo矩阵系统源码搭建技术+二开开源代码定制部署

抖音已经成为了当今最为流行的短视频平台之一,拥有着庞大的用户群体和海量的视频资源。对于一些商家或者运营者来说,如何从这些视频资源中挖掘出有效的信息,进而提升自己的品牌、产品或者内容的曝光度,就成为了一个非常重要的问题…

一次通过.frm和.ibd恢复mysql数据表的过程

1、导出.frm和.ibd文件 2、安装Mysql的Utilities 3、执行命令(实际恢复的表) mysqlfrm --diagnostic ./stat_vehicle_mileage.frm4、复制Sql,添加ROW_FORMATCOMPACT(需要检测生成的Sql语句是否可用) CREATE TABLE …

Android开发-Android常用组件-ProgressBar进度条

4.8 ProgressBar进度条 常用属性 android:max 进度条的最大值 android:progress 进度条已完成进度值 android:progressDrawable 设置轨道对应的Drawable对象 android:indeterminate 如果设置成true,则进度条不精确显示进度 android:indeterminateDrawable …

YOLO算法改进指南【算法解读篇】:2.如何训练自己的数据集

我们接着上一篇文章配置完YOLOv5需要的环境后,今天我们试着用YOLOv5训练自己的数据。(在开始本教程前,记得先跑一遍入门篇,确保环境是正常的) 有图有真相,先看看我的运行结果 【YOLOv5 源码地址】 🚀 我的环境: 语言环境:Python3.8编译器:PyCharm深度学习环境: to…

2021蓝桥杯真题格点(填空题) C语言/C++

问题描述 如果一个点(x,y) 的两维坐标都是整数, 即 x∈Z 且 y∈Z, 则称这个点为 一个格点。 如果一个点 (x,y) 的两维坐标都是正数, 即 x>0 且 y>0, 则称这个点在 第一象限。 请问在第一象限的格点中, 有多少个点(x,y) 的两维坐标乘积不超过 2021 , 即x⋅y≤2021 。 掟…

c#之反射详解

总目录 文章目录总目录一、反射是什么?1、C#编译运行过程2、反射与元数据3、反射的优缺点二、反射的使用1、反射相关的类和命名空间1、System.Type类的应用2、System.Activator类的应用3、System.Reflection.Assembly类的应用4、System.Reflection.Module类的应用5、…

SpringBoot 整合RabbitMq 自定义消息监听容器来实现消息批量处理

SpringBoot 整合RabbitMq 自定义消息监听容器来实现消息批量处理前言添加依赖配置文件编写监听器创建SimpleRabbitListenerContainerFactory发送消息前言 RabbitMQ是一种常用的消息队列,Spring Boot对其进行了深度的整合,可以快速地实现消息的发送和接收…

PCB模块化设计16——RS232,RS485接口模块PCB布局布线设计规范

目录PCB模块化设计16——RS232,RS485接口模块PCB布局布线设计规范RS232接口模块1、接口概述2、接口电路 原理图的EMC设计3、连接器设计4、线缆设计5、RS-232常规管脚定义:6、RS-232知识要点RS485接口模块1、原理图设计方案1、RS485接口6KV防雷电路设计方…

c语言程序笔记(1)

C语言笔记&#xff08;1&#xff09;——B站翁恺视频 程序框架 #include <stdio.h> int main() {//printf("hello world!\n");return 0; }1、变量与常量。 例子1&#xff1a; #include <stdio.h> int main() {printf("1234%d",1234);return …

图解LeetCode——合并两个有序链表

如果你喜欢这篇文章的话&#xff0c;请给作者点赞关注哟&#xff0c;你的支持是我不断前进的动力&#xff01; 目录 题目描述&#xff1a; 解法&#xff1a; 完整代码&#xff1a; 结果 题目链接&#xff1a;力扣 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序…

2017世界互联网领先成果来了 光量子计算机

演讲者&#xff1a;陆朝阳中国科学技术大学教授 发布了世界上首台超越早期经典计算机的光量子计算机 陆朝阳&#xff1a;很高兴向大家报告中国科学院在量子计算这个领域取得的基础性的研究成果。 我们知道50多年以来摩尔定律一直见证着计算机的更新换代&#xff0c;之前每过18个…

【新2023Q2模拟题JAVA】华为OD机试 - 绘图机器

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:绘图机器 题目 绘图机器的绘…

读书笔记-纳瓦尔宝典-2023.04.01

重点 财富 如何构造高价值信息 判断力 何为幸福 启发 最近看了这本书的大部分内容&#xff0c;感悟颇多&#xff0c;及时记录下来。 因为是快速阅读&#xff0c;还未做深入思考和实践&#xff0c;但对总体的内容有一个大致把握&#xff0c;未来会结合行动反复阅读和思考&…