从零开始HashMap

目录

1.HashMap的数据结构

2.put()流程

2.1了解扩容机制

2.2扩容三个地方

2.3存入数据步骤

3.HashMap和Hashtable的区别

4.HashMap线程安全的解决办法

4.1Hashtable

4.2Collections

4.3ConcurrentHashMap

线程安全实现机制


1.HashMap的数据结构

从JAVA1.8开始,当链表长度达到8 && 数组容量达到64,则链表转化为红黑树

数组:存储key经过hashcode()计算出的hash值

链表/红黑树:通过线性结构或树状结构存储hash值相同的value

2.put()流程

2.1了解扩容机制

扩容,即创建一个2倍大的新数组,然后再将旧数组中的数组迁移到新数组里。

2.2扩容三个地方

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

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

3. 添加后,如果数组中元素超过阈值,即比例超出限制(默认为0.75),则扩容。

2.3存入数据步骤

默认已经算好key的hashcode

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

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

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

4. 插入元素后,判断元素的个数,若发现超过阈值则再次扩容。

3.HashMap和Hashtable的区别

1、 Hashtable在实现Map接口时保证了线程安全性,而HashMap则是非线程安全的。

2、 Hashtable的性能不如HashMap,因为为了保证线程安全它牺牲了一些性能。

3、 Hashtable不允许存入null,而HashMap是允许存入null的。

总结:Hashtable是线程安全的,但仍然不建议在多线程环境下使用Hashtable。因为它是一个古老的API,从Java 1.0开始就出现了,它的同步方案还不成熟,性能不好。

建议使用ConcurrentHashMap

4.HashMap线程安全的解决办法

4.1Hashtable

很古老的API,官方不推荐使用,所以这里参考上文,不多赘述

4.2Collections

Collections类中提供了synchronizedMap()方法,可以将我们传入的Map包装成线程同步的Map。

Collections提供了三类方法来返回一个不可变的集合,这三类方法的参数是原有的集合对象,返回值是该集合的“只读”Map,分别是emptyMap(), singletonMap(),unmodifiableMap()

4.3ConcurrentHashMap

底层数据结构:与HashMap一致,“数组+链表+红黑树”

线程安全方面:采用锁定头节点的方式降低了锁粒度,以较低的性能代价实现了线程安全。

线程安全实现机制

1. 初始化数组或头节点时,ConcurrentHashMap并没有加锁,而是CAS的方式进行原子替换。 2. 插入数据时会进行加锁处理,锁定头节点。所以,ConcurrentHashMap中锁的粒度是槽,而不是整个数组,并发的性能很好。

3. 扩容时会进行加锁,锁定的仍然是头节点。并且,支持多个线程并发对数组扩容,提高并发能力。每个线程需先以CAS操作抢任务。抢到任务后,该线程会锁定槽内的头节点,然后将链表或树中的数据迁移到新的数组里。

4. 查找数据时并不会加锁,所以性能很好。

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

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

相关文章

14届蓝桥杯 C/C++ B组 T6 岛屿个数 (BFS,FloodFill,填色)

首先拿到这道题不要想着去直接判断环里面的岛屿,这样太困难了,我们可以使用之前做过的题的经验,在输入加入一圈海水,然后从(0,0)点开始BFS,这里进行八向搜索,搜到的0全部都染色成2,假如2能够蔓延…

Vue项目打包配置生产环境去掉console.log语句的方法

一、Vue2项目 使用webpack内置的 terser 工具,在vue.config.js文件加上相应的配置即可。 二、Vue3项目 同样是使用 terser 工具,不过vite没有内置terser,需要手动安装依赖 安装完后在vite.config.js文件加上相应的配置即可。 2024-4-9

VRRP——虚拟路由冗余协议

什么是VRRP 虚拟路由冗余协议VRRP(Virtual Router Redundancy Protocol)是一种用于提高网络可靠性的容错协议。 通过VRRP,可以在主机的下一跳设备出现故障时,及时将业务切换到备份设备,从而保障网络通信的连续性和可…

php其他反序列化知识学习

简单总结一下最近学习的,php其他的一些反序列化知识 phar soap session 其他 __wakeup绕过gc绕过异常非公有属性,类名大小写不敏感正则匹配,十六进制绕过关键字检测原生类的利用 phar 基础知识 在 之前学习的反序列化利用中&#xff0…

kvm虚拟机磁盘镜像加密

一、qcow2的aes加密 低版本的qemu能够支持对qcow2文件进行aes加密的方式,例如对一个已经存在的磁盘文件test.qcow2,可以将其转换为经过加密的qcow2文件。 qemu-img convert -O qcow2 --object secret,idsec0,data123456 -o encryptionon,encrypt.key-s…

(学习日记)2024.04.18:UCOSIII第四十六节:CPU利用率及栈检测统计

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

【Linux学习笔记】安卓运行C可执行文件No such file or directory

文章目录 开发环境运行失败现象解决办法方法一:使用静态库方法二:使用动态库创建lib查找依赖库复制需要注意的事情 开发环境 开发板:正点原子RK3568开发板安卓版本:11可执行程序命名:ledApp需加载模块:dts…

vue3大事件项目3

弹框验证 先准备变量: const formModel ref({ cate_name: , cate_alias: }) 还有规则: const rules { cate_name: [ { required: true, message: please input name, trigger: blur }, { pattern: /^\S{1,10}$/, message: must be 1-10, trigger: blur } ], …

Java 基于微信小程序的智能停车场管理小程序

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

Rust腐蚀服务器常用参数设定详解

Rust腐蚀服务器常用参数设定详解 大家好我是艾西,一个做服务器租用的网络架构师上期我们分享了rust腐蚀服务器的windows系统搭建方式,其中启动服务器bat参数因为涉及的东西比较多所以想通过这篇文章给大家做一下详细的分享。 (注本文中xxxx…

浅述.Net中的Hash算法(顺带对称、非对称算法)

【写在前面】 对称加密算法(只有一个私钥,比如DES【不推荐】、AES); 非对称加密算法(公钥与私钥,比如RSA); Hash算法也称为散列函数算法,任意长度的数据都转换为固定长度的字符串&#xff08…

【自然语言处理八-transformer实现翻译任务-一(输入)】

自然语言处理八-transformer实现翻译任务-一(输入) transformer架构数据处理部分模型的输入数据(图中inputs outputs outputs_probilities对应的label)以处理英中翻译数据集为例的代码 positional encoding 位置嵌入代码 鉴于transfomer的重要性&#xf…

1.汉诺塔问题

C力扣 汉诺塔 class Solution { public:void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {dfs(a,b,c,a.size());}void dfs(vector<int>& a, vector<int>& b, vector<int>& c,int n){if(n1){c.push…

阻塞队列和生产消费模型

阻塞队列 阻塞队列的概念 队列相信我们已经不陌生了 之前也学过很多队列 比如: 普通队列 和 优先级队列 两种 这两种队列都是线程不安全的 而我们讲的阻塞队列 刚好可以解决线程安全问题 也是先进先出 并且带有阻塞功能. 阻塞功能是怎么回事呢 就是如果入队的时候阻塞队列为…

rabbitmq安装rabbitmq-delayed-message-exchange插件

下载地址&#xff1a;Community Plugins | RabbitMQ 上传到rabbitmq安装目录的/plugins目录下 我的是/usr/lcoal/rabbitmq/plugins/ 直接安装 [rootk8s-node1 rabbitmq]# rabbitmq-plugins enable rabbitmq_delayed_message_exchange [rootk8s-node1 rabbitmq]# rabbitmq-pl…

pringboot2集成swagger2出现guava的FluentIterable方法不存在

错误信息 Description: An attempt was made to call a method that does not exist. The attempt was made from the following location: springfox.documentation.spring.web.scanners.ApiListingScanner.scan(ApiListingScanner.java:117) The following method did not ex…

c语言例题,求数组中最大值,99乘法口诀表

例题1&#xff1a;求出数组中最大的值 根据题意&#xff0c;我们知道的是需要从一个数组中找到一个最大的元素并且输出。那首先我们先建立一个数组&#xff0c;然后将一些不有序的整型元素放到数组中&#xff0c;然后再建立一个变量来存放数组中的第一个元素&#xff0c;通过一…

算法设计与分析实验报告c++实现(八皇后问题、连续邮资问题、卫兵布置问题、圆排列问题)

一、实验目的 1&#xff0e;加深学生对回溯法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 用回溯…

vue简单使用五(组件的使用)

目录 如何定义组件&#xff1a; 组件的命名&#xff1a; 父组件向子组件传值&#xff1a; 子组件向父组件传值&#xff1a; 如何定义组件&#xff1a; 全局组件定义&#xff1a; 局部组件定义&#xff1a; 组件的基本使用&#xff1a; 打印结果&#xff1a; 组件的命名&#xf…

分类预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络数据分类预测

分类预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络数据分类预测 目录 分类预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现OOA-BP鱼鹰算法优化BP神经网络多特征分类预测&#xff08;完整源码和数…