首页 > 其他分享 >HashMap的底层原理

HashMap的底层原理

时间:2023-09-10 15:55:08浏览次数:35  
标签:Hash HashMap 数组 链表 线程 哈希 原理 底层

HashMap

哈希表(Hash Table)是一种用于存储键值对的数据结构,他的底层实现在jdk1.8后是数组+链表+红黑树,在jdk1.8前是数组+链表,他通过哈希函数将键映射到储存桶中,从而实现快速的插入,查找和删除操作。哈希表的实现通常包括一个数组和一个哈希函数,其中数组用于储存键值对,哈希函数将建映射到数组的索引上,当两个不同的键被哈希函数映射到同一索引上时,就会发生哈希冲突,此时需要使用一些技术来解决冲突,例如链式法或开放寻址法。

哈希函数呢就是会把键转化为一个索引值,通常回事一个整数,好一点的哈希函数应该尽可能均匀地将键和值映射到不同的索引上,以减少哈希冲突的概率。

数组的话,就是用来存储键值对,数组的大小通常是固定的,但是也可以动态调整。

如果两个键产生了相同的索引位置就是发生了冲突,此时可以采用链式法在冲突的索引位置上维护一个链表或则其他数据结构,将冲突的键值对依次添加到链表中。也可以用开放寻址法根据一定的规则在其他空闲位置进行探测知道找到一个可用的位置。

Hash Map通过哈希值的计算和直接索引访问,可以快速查找键得对应值,这样既实现了高效的查询,也实现了快速的插入和删除。Hash Map的键值对是无序储存的不会保持插入顺序或者其他特定的排序顺序,并且是不可重复的,因为不一定挂到哪一个单向链表上的,因此加入顺序和取出也不一样。怎么保持不可重复?使用equals方法来保证HashMap集合key不可重复,如key重复来,value就会覆盖。存放在HashMap集合key部分的元素,其实就是存放在HashSet集合中,则HashSet集合也需要重写equals和Hash Code方法。

Hash Map具有动态扩容的能力,Hash Map集合的默认初始化容量为16,默认加载因子为0.75,也就是说这个默认加载因子是当Hash Map集合底层数组的容量达到75%时,数组就开始扩容。Hash Map集合初始化容量是2的陪数,为了达到散列均匀,提高Hash Map集合的存取效率,JDK8之后,如果哈希表单向链表中元素超过8个,那么单向链表这种数据结构会变成红黑树数据结构。当红黑树上的节点数量小于6个,会重新把红黑树变成单向链表数据结构。

HashMap是允许存储null值和null键。当插入null值时,会将其哈希到数组的某个特定索引位置;当插入null键时,会将其存储在数组的第一个位置。

然而,Hashmap 函数也有一些缺点。首先,它的空间复杂度比较高。由于哈希表需要预留一定的空间来存储键值对,所以当哈希表中的键值对比较少时,它的空间利用率会比较低

另一个缺点是 Hashmap函数的性能可能会受到哈希冲突的影响当多个键映射到同一个索引位置上时,它们会被存储在同一个链表中。这意味着在查找、插入和删除操作时,我们需要遍历这个链表如果这个链表比较长,那么这些操作的时间复杂度就会变得比较高。

并且hash Map 的线程不安全,主要原因是它的内部结构和操作不是线程安全的,HashMap 的操作不是线程同步的,也就是说,在多线程环境下同时对 HashMap 进行读写操作可能会导致数据不一致的问题。

HashMap 的操作不是原子性的,例如 put() 方法涉及到了多个步骤,包括计算哈希值、查找或插入元素等。如果多个线程同时执行这些操作,就有可能导致数据不一致的情况。

HashMap 在扩容时,需要重新计算元素的哈希值并重新分配存储位置,这个过程涉及到对原数组进行复制和重新插入元素的操作。如果在扩容期间有其他线程对 HashMap 进行并发修改,就可能导致数据丢失或出现异常。

为了在多线程环境下安全地使用 HashMap,

可以使用同步机制:通过在访问 HashMap 时使用 synchronized 或其他锁机制来确保同一时间只有一个线程能够修改 HashMap。

也可以使用线程封闭:可以将 HashMap 封闭在单个线程中,通过使用 ThreadLocal 或将 HashMap 作为局部变量在每个线程中进行操作,从而避免多线程访问导致的线程安全问题。

 

标签:Hash,HashMap,数组,链表,线程,哈希,原理,底层
From: https://www.cnblogs.com/szza/p/17691359.html

相关文章

  • 蜂鸟的辅助抢单技术原理
    蜂鸟辅助抢单技术原理解析摘要:蜂鸟辅助抢单技术是一项基于自动化脚本的抢单辅助工具,它能够在特定的电商促销活动中帮助用户实现自动抢单的目标。本文将深入探讨蜂鸟辅助抢单技术的原理,包括其工作流程、关键技术以及实现方式等方面。正文:一、引言随着电商行业的蓬勃发展,促销......
  • 机器学习算法原理实现——决策树里根据信息增益选择特征
    先说熵的定义:  再看信息增益信息增益是一种用于特征选择的指标,用于衡量特征对于数据集分类的贡献程度。它基于信息熵的概念,通过比较特征划分前后的信息熵差异来评估特征的重要性。信息熵是衡量数据集纯度的指标,表示数据集中的不确定性或混乱程度。信息熵越高,数据集的不确......
  • 顶层Const和底层Const
    说的都是指针类型,只有指针有这种说法顶层const:     int*constp=a   表明指针本身的值(指向)是常量无法修改,也无法转化为int*类型。即便是const_cast试图去掉这样的顶层const属性也不可以。底层const:     intconst*p=a.  表明指针指向的对......
  • MRP物料需求计划的逻辑原理
    【摘要】MRP是生产制造企业“管好”物料的核心工具方法,基本思想是根据客户对最终产品的需求数量和需求时间,按产品的结构精确地算出所有零件和部件的数量,并按各种零件和部件的生产周期或采购周期(Leadtime,提前期),反推出它们的生产计划和采购计划。本期介绍MRP的基本逻辑原理和相关......
  • 自动控制原理,典型环节特性分析
    自动控制原理是指利用传感器获取系统的反馈信息,通过比较反馈信息与设定值之间的差异,根据一定的控制算法来调节执行器的输出,以实现对系统的自动控制和稳定运行。在自动控制中,典型的环节特性分析是对系统的输入和输出之间的关系进行分析和建模,以便设计合适的控制策略。典型环节特性分......
  • hashmap头插法和尾插法区别
    前言HashMap应该算是Java后端工程师面试的必问题,因为其中的知识点太多,很适合用来考察面试者的Java基础。开场面试官:你先自我介绍一下吧!安琪拉:我是安琪拉,草丛三婊之一,最强中单(钟馗不服)!哦,不对,串场了,我是**,目前在--公司做--系统开发。面试官:看你简历上写熟悉Java集合,Hash......
  • 解析排序算法:十大排序方法的工作原理与性能比较
    当我们面临对数据进行排序的任务时,计算机科学家们开发了多种排序算法来满足不同的需求。这些排序算法各具特点,适用于不同规模和类型的数据集。在本文中,我们将介绍十大常见的排序算法,并讨论它们的工作原理、时间复杂度以及适用场景。1.冒泡排序(BubbleSort)冒泡排序是最简单的排序算......
  • [web] Session原理 (转载)
    1SessionWeb三大概念:cookie,session,applicationSession(会话):记录一系列状态用户登录用户登录后的操作Session与cookie功能效果相同。Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客户端的。解释session:当用户访问服务器某个网页时,服......
  • 机器学习算法原理实现——线性判别分析LDA
    介绍线性判别分析(LinearDiscriminantAnalysis,LDA)是一种有监督式的数据降维方法,是在机器学习和数据挖掘中一种广泛使用的经典算法。LDA的希望将带上标签的数据(点),通过投影的方法,投影到维度更低的空间中,使得投影后的点,按类别区分成一簇一簇的情况,并且相同类别的点,将会在投影后的......
  • 字符串连接原理
    title:字符串连接原理index_img:img/2.svgtags:-JavaSE-字符串categories:-JavaSEhide:falseexcerpt:字符串拼接方式、效率、对象使用+运算符无变量参与运行前就直接拼接为一个字符串publicclassMain{publicstaticvoidmain(String[]arg......