Map集合之HashMap细说

        最近在看面试题,看到了hashmap相关的知识,面试中问的也挺多的,然后我这里记录下来,供大家学习。

Hashmap为什么线程不安全

  • jdk 1.7中,在扩容的时候因为使用头插法导致链表需要倒转,从而可能出现循环链表问题或者数据丢失的问题

  • jdk 1.8中,在put方法中,假设A,B两个线程都插入相同的值到同一个下标,这个下标对应的值此时为null,假设线程A进行方法后挂起,而线程B顺利执行,此时该下标对应的值为B插入的值,然后A线程获得时间轮,此时线程A不再进行hash判断了,直接进行插入,就会导致覆盖了原来B插入到该下标的值

HashMap类(底层为数组+链表+红黑树)

扩容机制

        在java8以后,满足扩容机制的只需要笑傲一个条件即可,即当加入的新的数据和其他数据大于或者等于阈值就会发生扩容,且这种扩容形式也是在先插入新值后,再进行扩容。

        在java7中,每个节点存放一个Entry,每个Entry后面跟着一个链表,链表的每个节点存放一个Entry,这个Entry上保存有相应的key/Value,且存放着下一个节点的地址;在java8之后,因为引入了红黑树,所以把Entry改成了Node,其他的存放的内容都和Entry上面存放的一样。

        但是,在java8后虽然底层结构变成了数组+链表+红黑树,但是不一定会用到红黑树,只有当总的数据量大于64或者链表长度大于8的时候会将链表转换为红黑树。

扩容满足的条件(什么时候扩容)

在java7中,扩容需要满足以下两个条件(任意一个满足都会发生扩容)

  • 存放当前元素前,数据个数大于等于阈值

  • 存放当前元素时发生hash冲突

在java8后,扩容只需要满足--》存放当前元素后,数据量大于等于阈值,且扩容是在插入新数据后进行扩容

为什么在JDK 1.8后hashmap底层要添加红黑树

        当hash冲突过多的时候,数据插入到链表后面就会越来越多,就会导致链表链化严重,对于CRUD这些操作会造成较高的复杂度(O(n)),所以为了解决这一问题,在java8后使用红黑树来处理这种链化的情况。

hash冲突怎么解决

        hash冲突表示的是当插入一个新值的时候通过hash函数计算出的下标值已经存入得对应数据,这个时候再插入一个值的时候就会出现hash冲突。

开放地址法
线性探测

        根据hash函数计算下标值,如果当前下标已经有值存在,那就去判断下一个下标是否存值,通过这样的方式来解决hash冲突,但是这样的方式可能会引起聚集,即连续找了多次下标都是有值的情况,这样会在后续的操作中增加复杂度。

二次探测

即根据hash下标的二次方进行探测(1,4,9.......),这样的做法可以减少聚集的问题

双重散列

        如果当前通过hash散列函数计算出的下标已经存入了值,那就在用另外的hash散列函数再次进行计算

链地址法

        每一个hash桶后面都会跟着一个链表,当通过hash函数找到对应桶,如果当前值对应下标在链表中已经存入了值,那么就会将该值放在链表末尾然后进行存储。

再哈希

       再哈希是指当前的哈希函数计算出来的下标值已经被占用,这时就会使用一个新的哈希函数来进行再次计算。

双重散列和再哈希的区别

        双重散列和再哈希都是需要使用多个hash函数来解决hash冲突,但是对于双重散列而言,每一次的hash函数都是新的hash函数,不会根据前一个hash函数计算出来的下标值为基础进行计算,而再哈希的每一个hash函数会根据前一个hash函数计算出来的下标值为基础进行计算,这样对于下一次计算出来的下标肯定不会和前一个hash函数计算出来的下标相重合。

hashmap和hashtable的区别

  • hashmap是线程不安全的,而hashtable是线程安全的

  • hashmap可以存储null键和null值,hashtable不能存储null键和null值

  • hashmap在jdk1.8之后底层结构为数组+链表+红黑树,hashtable底层数据结构为数组+链表

以上为自己学习过程中列出来的知识点,当然还存在很多不足,各位有补充的可以在评论区进行留言我们共同学习~

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

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

相关文章

百度ai人脸识别项目C#

一、项目描述 本项目通过集成百度AI人脸识别API,实现了人脸检测和识别功能。用户可以上传图片,系统将自动识别人脸并返回识别结果。 二、开发环境 Visual Studio 2019或更高版本.NET Framework 4.7.2或更高版本AForge.NET库百度AI平台人脸识别API 三、…

Django 模版变量

1,模版变量作用 模板变量使用“{{ 变量名 }}” 来表示模板变量前后可以有空格,模板变量名称,可以由数字,字母,下划线组成,不能包含空格模板变量还支持列表,字典,对象 2,…

一文搞懂Linux信号【下】

目录 🚩引言 🚩阻塞信号 🚩信号保存 🚩信号捕捉 🚩操作信号集 1.信号集操作函数 2.其它操作函数 🚩总结: 🚩引言 在观看本博客之前,建议大家先看一文搞懂Linux信…

React hydrateRoot如何实现

React 服务器渲染中,hydrateRoot 是核心,它将服务器段的渲染与客户端的交互绑定在一起,我们知道 React 中 Fiber Tree 是渲染的的核心,那么 React 是怎么实现 hydrateRoot 的呢?首先我们验证一下,hydrateRo…

期货交易豆粕品种详细分析

文章目录 1、豆粕期货标准(2024年6月22号数据)2、豆粕是什么3、豆粕1、5、9合约区别4、影响豆粕的价格因素1、大豆的供应情况。2、豆粕的季节性3、油粕比(豆油和豆粕的价格关系 ) 5、美国大豆的生产/库存炒作6、豆粕双方&#xff…

uniapp实现路由拦截——遇到问题(三)

uniapp路由拦截开发过程中遇到问题 文章目录 uniapp路由拦截开发过程中遇到问题App 无法退出应用监听返回数据结构解决方式模拟原生物理返回键提示不提示,直接退出应用 微信小程序 登录成功返回页面报错效果图不同平台来源页面数据结构解决方式 App 无法退出应用 安…

2005年上半年软件设计师【上午题】试题及答案

文章目录 2005年上半年软件设计师上午题--试题2005年上半年软件设计师上午题--答案2005年上半年软件设计师上午题–试题

C++/Qt 小知识记录7

工作中遇到的一些小问题,总结的小知识记录:C/Qt 小知识7 编译FFMPEG遇到的问题CMakeLists.txt配置FFMPEG的依赖方式: x264在Windows下编译生成*.libVS编译Qt工程时,遇到提示Change Qt Version的情况在QtOsg的窗口上嵌入子窗口&…

面试官:请你实现三栏布局并且优先加载中间内容 我:稳啦- ̗̀(๑ᵔ⌔ᵔ๑)

前言 三栏布局是网页设计中一种经典布局方式,它将页面分为三个垂直部分:左栏、中栏和右栏,三栏在同一行显示。 这种布局模式在很多网站的首页或内容密集型页面中非常常见,因为它能够有效地组织信息,提供良好的用户体…

【产品应用】一体化步进伺服电机在吊装机器人中的应用

随着工业自动化和智能制造的发展,吊挂式智能巡检机器人逐渐成为许多工业场景中的重要角色。这类机器人不仅能够提升工作效率,减少人工干预,还能在复杂或危险环境中完成巡检任务。在这些机器人的设计与制造中,一体化步进伺服电机扮…

jrebel安装使用教程(2022.4.1版本)

本方法适用于jrebel2022.4.1版本,之后的版本不再适用。 1.下载插件 下载地址 2.安装插件 可以通过idea内部安装 也可以将插件解压进idea的安装目录下的plugins。 3.激活 Team URL中填入 https://jrebel.qekang.com/{guid}这里提供两个guid生成地址&#xf…

Redis学习|Redis基础知识、Redis五大数据类型、Redis三种特殊数据类型、Redis事务

Redis基础知识 redis默认有16个数据库,并且这个数量可以在conf配置文件中更改 默认使用的是第0个 可以使用 select 进行切换数据库! key *查看数据库所有的key 清除当前数据库 flushdb 清除全部数据库的内容FLUSHALL 为什么redis是6379!(了解一下即可!) Redis 是…

Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的

文章目录 Elasticsearch聚合查询说明空值率查询DSL Elasticsearch聚合基础知识扩展Elasticsearch聚合概念Script 用法Elasticsearch聚合查询语法指标聚合(Metric Aggregations)桶聚合(Bucket Aggregations)矩阵聚合(Ma…

福州大学 2022~2023 学年第 1 学期考试 A 卷压轴题参考答案

题目: 定义一个抽象类Structure(含有纯虚函数type函数,用以显示当前结构的类型; 含有show函数), 在此基础上派生出Building类, 用来存储一座楼房的层数、房间数以及它的总平方米数。 建立派生 类House&am…

Type-C连接器厂商对检测实验室的要求及重要性解析

Type-C连接器厂商对检测实验室的要求与重要性 Type-C连接器作为一种高速、全功能的接口标准,被广泛应用于各类电子产品中。作为Type-C连接器的制造商,对于产品的质量和性能要求是至关重要的。为了确保产品符合规范并满足市场需求,Type-C连接…

链动2+1模式:解锁用户留存与复购的增长密码

大家好,我是吴军,来自一家业界领先的软件开发公司,专注于为用户打造卓越的产品体验。今天,我想与大家探讨一个在我们产品运营中取得显著成效的策略——链动21模式,以及它是如何助力我们提升用户留存和复购率的。 尽管链…

跟TED演讲学英文:How language shapes the way we think by Lera Boroditsky

How language shapes the way we think Link: https://www.ted.com/talks/lera_boroditsky_how_language_shapes_the_way_we_think? Speaker: Lera Boroditsky Date: November 2017 文章目录 How language shapes the way we thinkIntroductionVocabularySummaryTranscriptA…

6.25世界白癜风日·成都博润白癜风医院获评“成都市医学重点专科”

夏日热情如江潮,勇攀高峰正当时。为激发新质生产力,驱动学术研究引领医院发展,也为了迎接 6.25 世界白癜风日。 6月22日,成都博润白癜风医院隆重举行成都市医学重点专科授牌新闻发布会暨成都市市级继续医学教育项目《难治性白癜风…

PythonScrapy爬虫被ban的一些解决办法

大多数python写爬虫都是当做工具在用,爬虫过程中都会遇到命中反爬导致无法继续访问。访问出现500或者其他服务器禁止错误,像下面这样 在这之前,默认你已经了解python及scrapy。具体selenium的使用方法可以查阅官方文档。 我的处理办法&#x…

Playwright-html-report源码解析

执行命令生成html格式报告 Playwright在执行完成测试,支持生成html格式的测试报告,如下图所示,使用"npx playwright test"执行测试,执行完成后,会提示“npx playwright show-report”命令。执行该命令&#…