了解HashMap底层数据结构吗


程序员的公众号:源1024,获取更多资料,无加密无套路!

最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等
获取方式: 关注公众号并回复 666 领取,更多内容持续奉上


HashMap的底层数据结构主要由数组和链表(或红黑树)组成。

HashMap内部维护了一个Entry数组,用于存储键值对对象Entry。数组的每个元素都是一个单向链表的头节点,如果发生哈希冲突(即两个不同的键经过哈希运算得到的数组索引位置相同),则将新的键值对添加到对应索引位置的链表中。

1. 哈希表

HashMap主要依赖于哈希表(数组)来存储数据。哈希表中的每个元素被称为“bucket”。数组的每个位置(bucket)都可以存放一个元素(键值对),数组的索引是通过键的哈希码经过哈希函数计算得来的。这样我们就可以通过键快速定位到数组的某个位置,取出相应的值,这就是HashMap快速获取数据的原理。

2. 链表

在理想的情况下,哈希函数将每个键均匀地散列到哈希表的各个位置。但在实际中,我们可能会遇到两个不同的键计算出相同的哈希值,这就是所谓的“哈希冲突”。HashMap通过使用链表来解决这个问题。

当哈希冲突发生时,HashMap会在冲突的bucket位置增加一个链表,新的元素会被添加到链表的末尾。每个链表中的元素都包含了相同哈希值的键值对。所以在查找元素时,如果遇到哈希冲突,HashMap需要进行一次线性查找。

链表节点包含键、值和指向下一个节点的指针。在Java 8之后,当链表长度达到一定阈值时(默认为8),链表会自动转换为红黑树,以提高查找效率。

3. 红黑树

从Java 8开始,如果链表的长度超过一定的阈值(默认为8),那么链表会被转换为红黑树。

红黑树是一种自平衡的二叉搜索树,它的插入、删除和查找操作的时间复杂度都是O(log n),相比于链表,红黑树在查找效率上更高。

4. 扩容与重新哈希

HashMap在初始化时,会有一个默认的初始容量(16),并且有一个加载因子(0.75)。当HashMap的大小(也就是已经存储的键值对数量)超过 容量*加载因子 的时候,HashMap会进行扩容,新的容量是原来的两倍,并且会进行重新哈希,将已经存在的元素重新放入新的bucket位置。

总结

HashMap的底层数据结构包括:哈希表(数组)、链表和红黑树。通过哈希函数将键映射到数组索引位置,可以快速定位到对应的链表或红黑树,然后在链表或红黑树中进行查找、插入或删除操作。HashMap通过哈希表的数据结构,实现了高效的键值对存储和查找。

 


系列文章索引

MyBatis的插件能在哪些地方进行拦截?

了解MyBatis的缓存机制吗

面试官:谈谈对volatile的理解

Spring中用到了哪些设计模式

面试官:说一下SQL的执行过程

线程池的工作原理


 

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

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

相关文章

Spark将execl表格文件导入到mysql中

实现代码 excel所需的pom依赖 案例实现 实现代码 package excel_mysqlimport org.apache.spark.sql.SparkSession import java.util.Propertiesobject t1 {def main(args: Array[String]): Unit {val spark SparkSession.builder().appName("ExcelToMySQL") /…

视频剪辑技巧:批量剪辑新思路,AI智剪来助阵

在视频制作过程中,剪辑是一项至关重要的任务。然而,对于许多创作者来说,批量剪辑视频是一项耗时且繁琐的工作。传统的批量剪辑方法通常要创作者逐个打开视频文件,进行剪辑、调整色彩等操作。这种方法不仅效率低下,而且…

zookeeper集群(很少用)+kafka集群(常用)

一、zookeeper zookeeperkafka(2.7.0版本) kafka(3.4.1版本)不依赖于zookeeper 1、定义:zookeeper开源,分布式架构,提供协调服务(Apache项目),基于观察者模…

spring security 艰苦学习中

一、初次感知 1.jwt工具类 密钥secret 有点意思。 2.PasswordEncoder 对密码进行加密,在配置类中返回bean. 下面这个关于加密和解密的东西是有误导性的。

基础课13——知识库

1.知识库的概念、特点与功能 智能客服中的知识库是一个以知识为基础的系统,可以明确地表达与实际问题相对应的知识,并构成相对独立的程序行为主体,有利于有效、准确地解决实际问题。它储存着机器人对所有信息的认知概念和理解,这…

【C++初阶】:简单的图书管理系统(可保存,完整源代码)

图书管理系统 library.h #include<iostream> #include<string> #include<vector> using namespace std;/****************************************************************公共类**********************************************************************…

BIO、NIO、selector、Netty代码Demo示例

文章目录 &#xff08;一&#xff09;BIO&#xff08;Blocking I/O 阻塞I/O&#xff09;&#xff08;二&#xff09;NIO&#xff08;Non-Blocking I/O 非阻塞I/O&#xff09;&#xff08;三&#xff09;IO多路复用--Selector&#xff08;四&#xff09;Netty &#xff08;一&am…

C# Socket通信从入门到精通(12)——多个同步UDP客户端C#代码实现

前言: 我们在开发Udp客户端程序的时候,有时候在同一个软件上我们要连接多个服务器,这时候我们开发的一个客户端就不够使用了,这时候就需要我们开发出来的软件要支持连接多个服务器,最好是数量没有限制,这样我们就能应对任意数量的服务器连接,由于我们开发的Udp客户端程…

Python函数定义、函数调用详解

函数是 Python 程序的重要组成单位&#xff0c;一个 Python 程序可以由很多个函数组成。前面我们己经用过大量函数&#xff0c;如 len()、max() 等&#xff0c;使用函数是真正开始编程的第一步。 比如在程序中定义了一段代码&#xff0c;这段代码用于实现一个特定的功能。问题来…

Django路由分发

首先明白一点&#xff0c;Django的每一个应用下都可以有自己的templates文件夹&#xff0c;urls.py文件夹&#xff0c;static文件夹&#xff0c;基于这个特点&#xff0c;Django能够很好的做到分组开发&#xff08;每个人只写自己的app&#xff09;&#xff0c;作为老大&#x…

python读取excel自动化生成sql建表语句和java实体类字段

1、首先准备一个excel文件&#xff1a; idtypenameidint学号namestring姓名ageint年龄sexstring性别weightdecimal(20,4)体重scoredecimal(20,4)分数 2、直接生成java字段和注释&#xff1a; import pandas as pddf pd.read_excel(test.xlsx, sheet_nameSheet1)for i in ran…

算法通关村-----超大规模数据场景的问题

对20GB文件进行排序 问题描述 假设有一个20GB的文件&#xff0c;每行一个字符串&#xff0c;请说明如何对这个文件进行排序 问题分析 20GB的文件很难一次加载到内存中&#xff0c;可以采用分块策略&#xff0c;先使块内有序&#xff0c;在使块间有序。 实现思路 按照给定…