面试必备:HashMap底层数据结构?jdk1.8算法优化,hash冲突,扩容等问题

面试必备系列不会长篇理论求证,直接上答案,仅供参考,不喜勿喷。

1、能说说HashMap的底层原理吗?

HashMap<String,String> map = new HashMap<String,String>(); 

map.put(“key”,”value”); 

[<key1,value1>,<key2,value2>,<key3,value3>] 

HashMap底层实现是数组+链表,用来存储<key,value>形式的数据,当我们调用put(key,value)时,首先会通过hash(key) 来获取key的hash值,hash值对数组长度进行取模运算,定位到数组的一个存储位置 bucket,如果bucket没有发生冲突的话则直接放入数组,发生冲突的话则以链表的形式存储,jdk1.8之后引入了红黑树,链表的长度超过8之后会使用红黑树,小于6之后则又转换回来。

如下2、3条皆为第1条的补充,预防面试官细问。

2、jdk1.8中对hash算法和寻址算法的优化

jdk1.8中对hash算法进行了优化,之前在对key进行hash(key)计算时,采用的是取模运算,即第1条提到的,而优化后采用的是寻址算法,即:(n-1) & hash 『n为数组长度』

为什么要使用寻址算法呢?首先 「hash & (n-1)」 效果跟 hash 对 n 取模的效果是一样的, 但是『&』与运算的性能要优于 hash 对 n 取模。

3、hash冲突?怎么解决?

当我们put<key,value>时,首先通过hash(key)计算得到的hash值,再通过『&』与运算之后,得到了数组存储位置bucket,但此时出现了两个不同的key却计算出相等的bucket,举个例子:

数组A[0]位置计算出存放<张三,我是张三>数据,而在put<李四,我是李四>数据时,也计算为存放在A[0]位置,一个位置想存放两个数据?这就出现hash冲突了,怎么处理呢?

JDK是这样处理的,它会在这个位置(A[0])挂一个链表,这个链表表里面存放出现冲突的数据,即:让多个<key,value>数据同时放在数组的一个位置里。

get(key)时怎么取呢?当我们调用get(key)定位到数组位置时,如果发现这个位置挂载的是一个链表,那么就遍历链表,从里面找到自己想要的那个<key,value>数据。

格外补充:这个地方,在JDK1.8之后引入了红黑树的概念,首先我们看一下为啥要引入红黑树,如果没有引入红黑树,当数组挂载的链表达到一定长度之后,查询是非常耗时的,性能比较差,时间复杂度为:O(n)「读作:偶en」。

JDK1.8的优化就是,当链表的长度发到了一定长度后(8)会自动转换为红黑树,遍历一棵红黑树查找一个元素的时间复杂度为:O(logn)「读作:偶,老个en」,性能相对链表要高一些。

简单总结一下:

  1. 出现hash冲突的原因?两个不同的key计算出相同的数组存放位置;

  2. 初期是怎么解决的?在出现数组冲突的位置挂一个链表,实现存放多个数据。

  3. JDK1.8的优化?当数组长度达到一定值后自动转换为红黑树,降低时间复杂度。

4、HashMap是如何扩容的?

HashMap底层是一个数组,当数组满了之后,他会自动进行2倍扩容,用于盛放更多的数据。

比如,本来数组默认长度=16,扩容后*2=32。

扩容后还有一步操作:rehash,重新对每个hash值进行寻址,也就是用每个hash值跟新的数组长度 n-1 进行『&』与运算操作。

补充:扩容之后的与运算可能会导致之前的发生hash冲突的元素不再发生冲突。

博客地址:https://www.cnblogs.com/niceyoo

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

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

相关文章

[js] 请写一个性能最好的深度克隆对象的方法

[js] 请写一个性能最好的深度克隆对象的方法 const deepClone (obj) > {const copy obj instance Array ? [] : {};for (let key in obj) {if (obj.hasOwnProperty(key)) {copy[key] typeof obj[key] object ? deepClone(obj[key]) : obj[key]}} return copy; }个人简…

快速下载||AnotherRedisDesktopManagerMedis-Redis可视化工具

尽管是在Gitee上下载这款软件&#xff0c;网速仍然是非常的慢&#xff0c;不知道是不是我的网络问题。 提供一份我的下载链接 MacOS&#xff1a;Another.Redis.Desktop.Manager.1.3.1.dmg Windows&#xff1a;Another.Redis.Desktop.Manager.1.3.1.exe 也许你还想试试Medis Mac…

[js] 使用ajax请求真的不安全吗?为什么?

[js] 使用ajax请求真的不安全吗&#xff1f;为什么&#xff1f; AJAX是发送HTTP请求的一种方式&#xff0c;只不过浏览器给它加了一个同源策略而已。 所以从这一点可以得出一个结论&#xff1a;AJAX本质上安全性和HTTP请求一样个人简介 我是歌谣&#xff0c;欢迎和大家一起交…

面试必备:synchronized的底层原理?

最近更新的XX必备系列适合直接背答案&#xff0c;不深究&#xff0c;不喜勿喷。 你能说简单说一下synchronize吗&#xff1f; 可别真简单一句话就说完了呀~ 参考回答&#xff1a; synchronize是java中的关键字&#xff0c;可以用来修饰实例方法、静态方法、还有代码块&#xff…

hadoop fs 命令详解

转载: https://blog.csdn.net/bgk083/article/details/49454209转载于:https://www.cnblogs.com/water-green/p/9050122.html

数组追加数组,小程序数组里面追加数组如何操作?

由于写错小程序生命周期函数方法名称「onLoad > onload」&#xff0c;一直以为自己用错了push… 需求描述 var arr[];var value [ a,b,c,d ]; 已有数组arr&#xff0c;获取的数据形式为数组value&#xff0c;需要将value追加值arr数组中&#xff0c;即[[],[]] 尝试过程 1、…

[js] 你有使用过pjax吗?它的原理是什么?

[js] 你有使用过pjax吗&#xff1f;它的原理是什么&#xff1f; pushState ajax pjax个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Python3回文相关算法小结

[本文出自天外归云的博客园] 总结一下关于回文相关的算法&#xff1a; 判断字符串本身是否是回文返回字符串中的所有子串找到字符串中包含的所有回文判断字符串中是否包含回文将字符串变成一个不包含回文的字符串代码如下&#xff1a; # 判断字符串本身是否是回文 def is_huiwe…

面试必备:CAS无锁机制

CAS无锁机制原理&#xff0c;面试高频问题之一&#xff0c;其实&#xff0c;日常开发中并不会直接使用CAS无锁机制&#xff0c;都是通过一系列封装好的工具类来使用&#xff0c; 说不定面试官不提问&#xff0c;都不知道有这么个东西存在。 1、能说一下你对CAS的理解吗&#xf…

[js] 根据元素ID遍历树形结构,查找到所有父元素ID

[js] 根据元素ID遍历树形结构&#xff0c;查找到所有父元素ID var list [{ "orgId": 1, "orgName": "校长办公室1", "parentId": 0 },{ "orgId": 2, "orgName": "校长办公室2", "parentId"…

安装oracle和plsql心得

最近给两台裸机安装oracle&#xff0c;plsql&#xff0c;java运行环境等相关。从中分享一些小心得。 1.oracle安装&#xff0c;基本都是安装ORACLE11g的&#xff0c;中途遇到报错了是因为64位windows系统&#xff0c;需要重新拷贝对应文件夹到对应文件下。 2.plsql安装的话&…

[js] 举例说明Object.defineProperty会在什么情况下造成循环引用导致栈溢出?

[js] 举例说明Object.defineProperty会在什么情况下造成循环引用导致栈溢出&#xff1f; var data {count: 1,value: 2 } Object.defineProperty(data, count, {enumerable: true,configurable: true,get: function () {console.log(你访问了count, this.count); // 循环读取…

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})注解作用

有小伙伴在群里问到对 SpringBootApplication(exclude { DataSourceAutoConfiguration.class}) 有点疑惑&#xff0c;故记之。 exclude&#xff0c;排除此类的AutoConfig&#xff0c;即禁止 SpringBoot 自动注入数据源配置&#xff0c;怎么讲&#xff1f; DataSourceAutoConfi…

[js] 写一个方法,当给定数字位数不足8位时,则在左边补充0以补足8位数的方法

[js] 写一个方法&#xff0c;当给定数字位数不足8位时&#xff0c;则在左边补充0以补足8位数的方法 function padNumber(n, targetLen, placeholder) {const arr ("" n).split("");const diff arr.length - targetLen;if (diff < 0) {return Array(…

小程序json字符串取值问题,怎么取出来的是undefined,eval函数不能用?

1、后端返回的值 "{\"msg\":\"InvalidParameterValue.NoFaceInPhoto-图片中没有人脸。\",\"code\":500}” 关于为何会返回如上json字符串的场景&#xff1a;文件上传「声明了Content-Type」 wx.uploadFile({ url: common.apiServerwx/user…

asp.net mvc 自定义全局过滤器 验证用户是否登录

一般具有用户模块的系统都需要对用户是否登录进行验证&#xff0c;如果用户登录了就可以继续操作&#xff0c;否则退回用户的登录页面 对于这样的需求我们可以通过自定义一个独立的方法来完成验证的操作&#xff0c;但是这样代码的重复率就大大提高了 对于这样的需求&#xff0…

支付宝手机h5网页支付不再提供「继续浏览器付款」按钮了吗

来自圈友的疑惑&#xff0c;记录一下 之前写过一篇「支付宝手机h5支付的文章」&#xff0c;如果下载运行过Demo的小伙伴肯定发现了一个问题 > 「Demo中有显示继续浏览器付款按钮&#xff0c;但自己实际环境并没有」 难道是操作不对&#xff1f; 其实不然&#xff0c;这是两个…

[js] innerHTML与outerHTML有什么区别?

[js] innerHTML与outerHTML有什么区别&#xff1f; <div id"test"><h5>就是喜欢你</h5></div>document.getElementById("test").innerHTML //<h5>就是喜欢你</h5> document.getElementById("test").outHTM…

.NETFramework-Web.Mvc:ViewResult

ylbtech-.NETFramework-Web.Mvc&#xff1a;ViewResult1.程序集 System.Web.Mvc, Version5.2.3.0, Cultureneutral, PublicKeyToken31bf3856ad364e35返回顶部 1、#region 程序集 System.Web.Mvc, Version5.2.3.0, Cultureneutral, PublicKeyToken31bf3856ad364e35 // c:\users\…

ConcurrentHashMap底层原理?

本文为面试必备系列篇&#xff0c;不深入叙述&#xff0c;具体细节可自行查询。 可能会问的问题 1、用过ConcurrentHashMap吗&#xff1f;2、为什么要用ConcurrentHashMap&#xff1f;3、HashMap与HashTable的区别&#xff0c;引出ConcurrentHashMap…4、HashMap在多线程环境下…