HashMap 是怎么解决哈希冲突的?

(本文摘自mic老师面试文档)
常用数据结构基本上是面试必问的问题,比如 HashMap、LinkList、 ConcurrentHashMap 等。
关于 HashMap,有个学员私信了我一个面试题说: “HashMap 是怎么解决哈希冲突
的?”
关于这个问题,我们来模拟一下普通人和高手对于这个问题的回答。
普通人
嗯.... HashMap 我好久之前看过它的源码,我记得好像是通过链表来解决的!
高手
嗯,这个问题我从三个方面来回答。
1. 要了解 Hash 冲突,那首先我们要先了解 Hash 算法和 Hash 表。(如图)
a. Hash 算法,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出结果是散列值。
b. Hash 表又叫做“散列表”,它是通过 key 直接访问在内存存储位置的数据结 构,在具体实现上,我们通过 hash 函数把 key 映射到表中的某个位置,来获 取这个位置的数据,从而加快查找速度。
c. 所谓 hash 冲突,是由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,所以总会存在不同的数据经过计算后得到的值相同,这就是哈希冲突。
d. 通常解决 hash 冲突的方法有 4 种。
i. 开放定址法,也称为线性探测法,就是从发生冲突的那个位置开始,按照 一定的次序从 hash 表中找到一个空闲的位置,然后把发生冲突的元素存 入到这个空闲位置中。ThreadLocal 就用到了线性探测法来解决 hash 冲 突的。
向这样一种情况(如图),在 hash 表索引 1 的位置存了一个 key=name,当再次添加 key=hobby 时,hash 计算得到的索引也是 1,这个就是 hash 冲突。而开放定址法, 就是按顺序向前找到一个空闲的位置来存储冲突的 key。
ii. 链式寻址法,这是一种非常常见的方法,简单理解就是把存在 hash 冲突 的 key,以单向链表的方式来存储,比如 HashMap 就是采用链式寻址法 来实现的。
向这样一种情况(如图),存在冲突的 key 直接以单向链表的方式进行存储。
iii. 再 hash 法,就是当通过某个 hash 函数计算的 key 存在冲突时,再用另
外一个 hash 函数对这个 key 做 hash,一直运算直到不再产生冲突。这种
方式会增加计算时间,性能影响较大。
iv. 建立公共溢出区, 就是把 hash 表分为基本表和溢出表两个部分,凡事存
在冲突的元素,一律放入到溢出表中。
e. HashMap 在 JDK1.8 版本中,通过链式寻址法+红黑树的方式来解决 hash 冲
突问题,其中红黑树是为了优化 Hash 表链表过长导致时间复杂度增加的问题。
当链表长度大于 8 并且 hash 表的容量大于 64 的时候,再向链表中添加元素
就会触发转化。
以上就是我对这个问题的理解! 结尾
这道面试题主要考察 Java 基础,面向的范围是工作 1 到 5 年甚至 5 年以上。
因为集合类的对象在项目中使用频率较高,如果对集合理解不够深刻,容易在项目中制
造隐藏的 BUG。
所以,再强调一下,面试的时候,基础是很重要的考核项!!

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

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

相关文章

网络安全基础之php开发文件上传的实现

前言 php是网络安全学习里必不可少的一环,简单理解php的开发环节能更好的帮助我们去学习php以及其他语言的web漏洞原理 正文 在正常的开发中,文件的功能是必不可少,比如我们在论坛的头像想更改时就涉及到文件的上传等等文件功能。但也会出…

前端通过导入editor.md库实现markdown功能

小王学习录 今日摘录前言jquery下载editor下载editor和jquery的导入初始化editor总结 今日摘录 满招损,谦受益 前言 要想通过editor.md实现markdown的功能,需要经过如下四步: 下载editor.md到本地将本地editor导入到前端代码中编写少量代…

No source control providers registered

使用vscode时碰到这个问题 git扩展没启动

LeetCode(3)删除有序数组中的重复项【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接: 26. 删除有序数组中的重复项 1.题目 给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保…

推荐这款机器学习的特征筛选神器!

大家好,特征选择是机器学习建模流程中最重要的步骤之一,特征选择的好坏直接决定着模型效果的上限,好的特征组合甚至比模型算法更重要。除了模型效果外,特征选择还有以下几点好处: 提高模型性能并降低复杂性&#xff08…

华为ensp:交换机接口划分vlan

现在要把 e0/0/1 接口放入vlan1 e0/0/2 接口放入vlan2 e0/0/3 接口放入vlan3 默认所有接口都在vlan1所以 e0/0/0 接口不用动 1.创建vlan 进入系统视图模式 直接输入 vlan 编号 即可创建对应vlan vlan 编号 vlan 2 创建vlan2 vlan 3 创建vlan3 2.将接口进入vlan…

Spring Boot自动配置原理、实战、手撕自动装配源码

Spring Boot自动配置原理 相比较于传统的 Spring 应用,搭建一个 SpringBoot 应用,我们只需要引入一个注解 SpringBootApplication,就可以成功运行。 前面四个不用说,是定义一个注解所必须的,关键就在于后面三个注解&a…

Flink SQL自定义表值函数(Table Function)

使用场景: 表值函数即 UDTF,⽤于进⼀条数据,出多条数据的场景。 开发流程: 实现 org.apache.flink.table.functions.TableFunction 接⼝实现⼀个或者多个⾃定义的 eval 函数,名称必须叫做 eval,eval ⽅法…

OpenCV-Python小应用(九):通过灰度直方图检测图像异常点

OpenCV-Python小应用(九):通过灰度直方图检测图像异常点 前言前提条件相关介绍实验环境通过灰度直方图检测图像异常点代码实现输出结果 参考 前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多精彩内容&#xff…

centos7安装linux版本的mysql

1.下载linux版本的mysql 进入mysql官网,点击社区版本下载: https://dev.mysql.com/downloads/mysql/ 选择版本,可以跟着我下面这个图进行选择,选择红帽版本的既可,都是linux版本的。 2.上传解压linux版本的mysql安装包…

linux安装nodejs

写在前面 因为工作需要,需要使用到nodejs,所以这里简单记录下学习过程。 1:安装 wget https://nodejs.org/dist/v14.17.4/node-v14.17.4-linux-x64.tar.xz tar xf node-v14.17.4-linux-x64.tar.xz mkdir /usr/local/lib/node // 这一步骤根…

力扣138:随机链表的复制

力扣138:随机链表的复制 题目描述: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff…

【从0到1设计一个网关】上岸大厂的秘诀之一

文章目录 前言【从0到1设计一个网关】什么是网关?以及为什么需要自研网关?【从0到1设计一个网关】自研网关的设计要点以及架构设计【从0到1设计一个网关】自研网关的架构搭建【从0到1设计一个网关】网络通信框架Netty的设计【从0到1设计一个网关】整合Na…

智能指针,c++11,单例,类型转换

c11 unique_ptr 防拷贝 shared_ptr / weak_ptr: 引用计数,支持拷贝 面试 手写shared_ptr 各种ptr的特性对比, 不会问定制删除器和weak_ptr,但是问shared_ptr时,可以往这边延展. 单例 保证一写数据在一个进程中,只有一份,并且方便访问修改. 饿汉模式 在main函数之前就创…

竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域,在无人驾驶领域中机器学习的各种算法随处可见,今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂,看上去无从下手。那么面对这样极其…

win10网络和Internet设置

win10网络设置 win10进入网络设置的常用入口有两个 第一个入口 桌面右下角右键网络图标,然后打开“网络和Internt设置” 第二个入口 桌面的“我的网络”快捷方式,或者我的电脑进去后,左侧栏找到“网络” 右键“属性” 可以看到,…

图论10-哈密尔顿回路和哈密尔顿路径+状态压缩+记忆化搜索

文章目录 1 哈密尔顿回路2 哈密尔顿回路算法实现2.1 常规回溯算法2.2 引入变量记录剩余未访问的节点数量 3 哈密尔顿路径问题4 状态压缩4.1 查看第i位是否为14.2 设置第i位是为1或者04.3 小结4.4 状态压缩在哈密尔顿问题中的应用 5 记忆化搜索5.1 记忆化搜索与递推区别5.2 记忆…

基于单片机的空调智能控制器的设计

**单片机设计介绍,基于单片机的空调智能控制器的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的空调智能控制器需要具备输入输出端口、定时器、计数器等模块,以便对空调进行精确控制。下…

补坑:Java的字符串String类(3):再谈String

不太熟悉字符串的可以看看这两篇文章 补坑:Java的字符串String类(1)-CSDN博客 补坑:Java的字符串String类(2):一些OJ题目-CSDN博客 字符串创建对象 public static void main(String[] args) …

ES6学习

let和const命名 let基本用法-块级作用域 在es6中可以使用let声明变量,用法类似于var ⚠️ let声明的变量,只在let命令所在的代码块内有效 {let a 10;var b 20; } console.log(a); //a is not defined console.log(b); //20不存在变量提升 var命令…