一篇文章,轻松拿捏大厂必问的HashMap源码分析

这篇具有很好参考价值的文章主要介绍了一篇文章,轻松拿捏大厂必问的HashMap源码分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一,JDK8之后HashMap的新特性

二,hashMap源码属性解读

(一),默认初始化容量数量:16

(二),最大数组容量:2^30

(三),默认负载因子:0.75f

(四),触发树化条件1,链表阈值:

(五),解树化的阈值:

 (六),触发树化条件二,hash桶阈值(数组元素个数):

三,HashMap的put方法

(一)put方法

(二),hash方法()

  (三),putVal方法

 put方法的核心逻辑: 

四,hashMap的构造方法

(一),无参构造

(二),有参构造

 五,resize()方法

六,关于Map和Set的关系


一,JDK8之后HashMap的新特性

JDK8之后的hashMap,采用   数组+链表+红黑树  的结构 

当链表冲突严重时,会将链表转换成红黑树的结构,提高查询效率。

冲突严重:是指

一篇文章,轻松拿捏大厂必问的HashMap源码分析

JDK8之前,hashMap采用 数组 + 链表的结构

二,hashMap源码属性解读

(一),默认初始化容量数量:16

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;

一篇文章,轻松拿捏大厂必问的HashMap源码分析

(二),最大数组容量:2^30

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

一篇文章,轻松拿捏大厂必问的HashMap源码分析

 

(三),默认负载因子:0.75f

static final float DEFAULT_LOAD_FACTOR = 0.75f;

一篇文章,轻松拿捏大厂必问的HashMap源码分析

(四),触发树化条件1,链表阈值:

链表的长度超过8,并且桶的个数达到64,就会触发链表转为树结构,否则只是数组扩容。

static final int TREEIFY_THRESHOLD = 8;

一篇文章,轻松拿捏大厂必问的HashMap源码分析 

(五),解树化的阈值:

当树的节点个数为6时,就会触发解树化转为链表。

static final int UNTREEIFY_THRESHOLD = 6;

一篇文章,轻松拿捏大厂必问的HashMap源码分析

 (六),触发树化条件二,hash桶阈值(数组元素个数):

static final int MIN_TREEIFY_CAPACITY = 64;

 当数组个超过64,并且某个链表的节点个数  >  8 时,同时满足这两个条件,才会触发树化。

一篇文章,轻松拿捏大厂必问的HashMap源码分析

三,HashMap的put方法

(一)put方法

一篇文章,轻松拿捏大厂必问的HashMap源码分析

(二),hash方法()

一篇文章,轻松拿捏大厂必问的HashMap源码分析

例如:

一篇文章,轻松拿捏大厂必问的HashMap源码分析

此时计算下来得结果并不是hash索引,长江此时计算得值传入到putVal中进一步运算才能得到真正得下标。

  (三),putVal方法

一篇文章,轻松拿捏大厂必问的HashMap源码分析

 采用&运算得原因:

这里hash表得长度为2^i,采用&是为压榨性能,

原因:n = 16 任意正整数 x ,   x & (n - 1) == x % n; 并且得到得结果 res < n,保证了索引在hash表的范围之内。

&&位运算得速率远大于数学运算。

一篇文章,轻松拿捏大厂必问的HashMap源码分析

 put方法的核心逻辑: 

一篇文章,轻松拿捏大厂必问的HashMap源码分析

 equals相同的两个对象,那么他们的hashCode一定相同,原因:两个对象时相同的,那么经过hash运算,得到的hashCode一定相同,

hashCode相同的两个对象,equals不一定相同,原因:当发生了hash冲突,他们的hash值相同,但对象不同。

四,hashMap的构造方法

(一),无参构造

一篇文章,轻松拿捏大厂必问的HashMap源码分析

一篇文章,轻松拿捏大厂必问的HashMap源码分析

懒加载模式:在创建时,不开辟空间,只有在第一次添加元素时,才开始对表扩容。

resize()方法既是扩容方法,也是初始化方法。

(二),有参构造

一篇文章,轻松拿捏大厂必问的HashMap源码分析

一篇文章,轻松拿捏大厂必问的HashMap源码分析

 一篇文章,轻松拿捏大厂必问的HashMap源码分析

 五,resize()方法

resize()方法既是扩容方法,也是初始化方法。

六,关于Map和Set的关系

Set集合实际上就是用Map集合的key保存的,这也就保证了Set的不可重复性。

HashSet使用HashMap的key保存,这就保证了HashSet可以为空,null全部保存在map的0位置。

TreeSet使用TreeMap的key保存的,也就保证了TreeSet不可以为空。

一篇文章,轻松拿捏大厂必问的HashMap源码分析

一篇文章,轻松拿捏大厂必问的HashMap源码分析文章来源地址https://www.toymoban.com/news/detail-400960.html

到了这里,关于一篇文章,轻松拿捏大厂必问的HashMap源码分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【大揭秘】SQL与NoSQL数据库的优缺点全面对比!一篇文章帮助你轻松解决选择困难症!

    从分析师、工程师到 IT 决策者,许多人都熟悉关系数据库管理系统(rDBMS)和用于与它们交互的 SQL (SQL)。虽然这些术语指的是一个几十年的范式,仍然是一个广泛使用的标准,今天的纯粹的多样性和数据库系统的深度可以令人眼花缭乱。更重要的是,不断增长的各种数据(尤其是

    2024年02月04日
    浏览(43)
  • 七大 排序算法(一篇文章梳理)

    排序算法是计算机科学中不可或缺的一部分,它们在数据处理、数据库管理、搜索引擎、数据分析等多个领域都有广泛的应用。排序算法的主要任务是将一组数据元素按照某种特定的顺序(如升序或降序)进行排列。本文将对一些常见的排序算法进行详细的介绍和分析,包括

    2024年03月08日
    浏览(52)
  • 一篇文章理解虚拟滚动原理

    首先提到一个现象,前端的性能瓶颈那就是页面的卡顿,当然这种页面的卡顿包含了多种原因。例如HTTP请求过多导致数据加载国漫,下载的静态文件非常大导致页面加载时间很长,js中一些算法响应的时间过长等。很多前端工程师都花费很多的精力在dom渲染上来优化页面加载

    2024年02月05日
    浏览(34)
  • 一篇文章学会高级IO

    IO是数据在传输时的一种动作描述,分为输入数据(I)和输出数据(O)两种动作。和一般而言,IO都需要维护一个收发数据的缓冲区,例如read、recv函数和write、send函数,它们的数据缓冲区都是由系统帮助创建的。对于C语言中常用到的scanf函数和printf函数,同样不需要用户自

    2024年02月05日
    浏览(64)
  • 一篇文章完成Hbase入门

    HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。 1、数据模型结构 逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map(多维地图) HBase逻辑结构 2、物理存

    2024年01月16日
    浏览(46)
  • 一篇文章玩透awk

    awk有很多种版本,例如nawk、gawk。gawk是GNU awk,它的功能很丰富。 本教程采用的是gawk 4.2.0版本,4.2.0版本的gawk是一个比较大的改版,新支持的一些特性非常好用,而在低于4.2.0版本时这些语法可能会报错。所以,请先安装4.2.0版本或更高版本的gawk。 查看awk版本 这里以安装ga

    2024年02月06日
    浏览(42)
  • ai写作软件怎么写文章?这篇文章介绍三个好方法

    在人工智能技术的迅速发展下,ai写作成为创作领域的一项炙手可热的新技术。随着越来越多的创作者开始借助ai写作工具,ai写作逐渐引起了广泛的关注。ai写作是指利用人工智能技术和自然语言处理算法,为创作者提供文章的初版。不过有很多小伙伴对这一项技术还不太了

    2024年02月11日
    浏览(39)
  • 【八大排序】一篇文章搞定所有排序

    1.1排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个具有相同的的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中, r[i]=r[j],且r[i

    2024年04月09日
    浏览(81)
  • 一篇文章彻底清楚shellcode(精品)

    1.没开沙箱(此时我们可以系统调用get shell) (一)32位程序系统调用 32位程序有别于64位程序,32位通过栈传参,我们常用的寄存器有4个数据寄存器(eax,ebx,ecx,edx),2个变址寄存器(esi,edi),2个指针寄存器(esp,ebp). 下边我们就来看一种系统调用方式及其构造: 执行上述shellcode即可g

    2024年02月09日
    浏览(41)
  • 一篇文章吃透背包问题!!!【动态规划】

    简单来说就是:一个小偷背了一个背包潜进了金店,包就那么大,他如果保证他背出来所有物品加起来的 价值最大 。 规范描述就是:有一个容量为 W 的背包,要用这个背包装下物品的 价值最大 ,这些物品有两个属性:体积 w 和价值 v 。 最常见的背包问题有 0-1背包 , 完全

    2024年02月05日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包