HashMap的底层实现原理

这篇具有很好参考价值的文章主要介绍了HashMap的底层实现原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

HashMap的底层实现原理


一、HashMap的底层实现原理

HashMap 在 JDK1.8 之前的实现方式:数组+链表
JDK1.8之后的实现方式:数组+链表+红黑树

原理:

当你 new 一个 HashMap() 的时候,它底层并没有创建数组。
/
只有当你首次调用 put() 方法时,底层就会创建一个长度为16的数组
/
用数组容量大小乘以加载因子得到一个阈值,一旦数组中存储的元素个数超过该阈值就会进行扩容,通过 rehash() 方法将数组容量增加到原来的两倍,在做扩容的时候会生成一个新的数组,原来的所有数据需要重新计算哈希码值重新分配到新的数组,所以扩容的操作非常消耗性能。

不同的对象算出来的数组下标是相同的这样就会产生 hash 冲突


二、为什么加载因子设置为0.75,初始化临界值是12?

默认的数组大小为16,加载因子为0.75

0.75是对空间和时间效率的一种平衡选择。
/
如果负载因子小一些比如是0.4,那么初始长度16*0.4=6,数组占满6个空间就进行扩容,很多空间可能元素很少甚至没有元素,会造成大量的空间被浪。
/
如果负载因子大一些比如是0.9,这样会导致扩容之前查找元素的效率非常低。
/
oadfactory设置为0.75是经过多重计算检验得到的可靠值,可以最大程度的减少rehash的次数,避免过多的性能消耗。


三、HashMap的判断机制

当链表长度超过8的时候,此时会继续判断哈希表的长度是否小于64。
/
如果小于64,会扩容,如果大于等于64,就会将链表转换为红黑树,提高查询的效率。
/
当红黑树节点小于等于6时又会退化为链表。


四、map.put实现原理

首先通过k的hashCode()方法得出哈希值,通过哈希算法转为数组下标。
/
如果数组下标位置没有元素,就直接添加元素。如果下标对应位置上有链表的话,就会拿k跟链表上所有的k进行equals比较,如果都返回false,就将新元素追加到链表的尾部。
/
如果其中有一个equals返回true,就会将这个节点的value覆盖


五、map.get实现原理

首先通过k的hashCode()方法得出哈希值,通过哈希算法转为数组下标。
/
如果数组下标位置没有元素,就直接返回null。如果下标位置上有链表的话,就会拿k跟链表上所有的k进行equals比较,如果都返回false,就直接返回null。
/
如果有一个返回true,就返回这个节点的value值。文章来源地址https://www.toymoban.com/news/detail-537435.html

到了这里,关于HashMap的底层实现原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HashMap 的底层实现#JDK1.8 之前

    最近很多同学问我有没有java学习资料,我根据我从小白到架构师多年的学习经验整理出来了一份 50W字面试解析文档、简历模板、学习路线图、java必看学习书籍  、 需要的小伙伴 可以关注我 公众号:“  Tom聊架构  ”, 回复暗号:“ 578 ”即可获取 JDK1.8 之前 JDK1.8 之前 H

    2024年01月20日
    浏览(40)
  • [JDK8下的HashMap类应用及源码分析] 数据结构、哈希碰撞、链表变红黑树

    [Java基础] StringBuffer 和 StringBuilder 类应用及源码分析 [Java基础] 数组应用及源码分析 [Java基础] String,分析内存地址,源码 [JDK8环境下的HashMap类应用及源码分析] 第一篇 空构造函数初始化 [JDK8环境下的HashMap类应用及源码分析] 第二篇 看源码了解HashMap的扩容机制 [JDK8环境下的

    2024年02月10日
    浏览(44)
  • [JAVA数据结构]HashMap

    目录 1.HashMap 1.1Map的常用方法 1.2HashMap的使用案例 基于哈希表的实现的Map接口。 Map底层结构 HashMap 底层结构 哈希桶 插入/删除/查找时间复杂度 O(1) 是否有序 无序 线程安全 不安全 插入/删除/查找区别 通过哈希函数计算哈希地址 比较与覆写 自定义类型需要覆写equals和 hashCod

    2024年02月12日
    浏览(64)
  • 【java数据结构】HashMap和HashSet

    目录 一.认识哈希表: 1.1什么是哈希表? 1.2哈希表的表示:  1.3常见哈希函数:  二.认识HashMap和HashSet: 2.1关于Map.Entry的说明:, 2.2Map常用方法说明: 2.3HashMap的使用案例: 2.4Set常见方法说明:  2.5HashSet使用案例: 源码: 之前的学习中,如果我们要查找一个元素,肯定是要经

    2024年03月14日
    浏览(84)
  • 【Java 数据结构】HashMap和HashSet

    目录 1、认识 HashMap 和 HashSet 2、哈希表 2.1 什么是哈希表 2.2 哈希冲突 2.2.1 概念 2.2.2 设计合理哈希函数 - 避免冲突 2.2.3 调节负载因子 - 避免冲突 2.2.4 Java中解决哈希冲突 - 开散列/哈希桶 3、HashMap 的部分源码解读 3.1 HashMap 的构造方法 3.2 HashMap 是如何插入元素的? 3.3 哈希表

    2024年02月01日
    浏览(44)
  • java八股文面试[数据结构]——HashMap扩容优化

         知识来源: 【2023年面试】HashMap在扩容上做了哪些优化_哔哩哔哩_bilibili  

    2024年02月11日
    浏览(39)
  • Java-数据结构(二)-Map:HashMap、TreeMap、LinkedHashMap

        Map是Java中常用的数据结构,它提供了一种键值对的存储方式,可以根据键来快速访问值。在本篇文章中,我将学习Java中的Map数据结构     问题是最好的老师,我将从至少以下几个方面阐述,什么是map、使用Map有什么好处、Map的底层原理、map中的key和value分别是

    2024年02月06日
    浏览(39)
  • java数据结构(哈希表—HashMap)含LeetCode例题讲解

      目录 1、HashMap的基本方法 1.1、基础方法(增删改查) 1.2、其他方法  2、HashMap的相关例题 2.1、题目介绍 2.2、解题 2.2.1、解题思路 2.2.2、解题图解 2.3、解题代码 HashMap 是一个散列表,它存储的内容是键值(key-value)映射。 HashMap 的 key 与 value 类型可以相同也可以不同,根据定

    2024年02月05日
    浏览(52)
  • 【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(下)

    在阅读了上篇文章《【深入挖掘Java技术】「源码原理体系」盲点问题解析之HashMap工作原理全揭秘(上)》之后,相信您对HashMap的基本原理和基础结构已经有了初步的认识。接下来,我们将进一步深入探索HashMap的源码,揭示其深层次的技术细节。通过这次解析,您将更深入地

    2024年02月01日
    浏览(47)
  • HashMap底层源码解析及红黑树分析

    HashMap线程不安全,底层数组+链表+红黑树 面试重点是put方法,扩容 HashMap的put方法,首先通过key去生成一个hash值,第一次进来是null,此时初始化大小为16,i = (n - 1) hash计算下标值,第一次获取是null,直接放入一个Node节点,如果不是null,分成下面三种情况 1)如果发现hash和

    2024年02月02日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包