深入解析HashMap的put方法

 更新时间:2022年01月19日 16:50:24   作者:小写丶H  
在Java集合中,HashMap的重要性不言而喻,作为一种存储键值对的数据结构,它在日常开发中有着非常多的应用场景,也是面试中的高频考点,本篇文章就来分析一下HashMap集合中的put方法

一.创建

这个相信大家也都知道怎么使用。今天就深入理解一下这里的底层原理。 首先HashMap在java中,创建出来是一个数组,然后数组上存放的元素是一个链表。

二.put()

进入底层源码看一下。

HashMap,在添加第一个元素的时候创建一个默认2的幂的数组。也就是16,这个参数也可以你自己设置。但是一定是2的幂,假如new HashMap(30),那么只会创建一个32大小的数组。

计算出元素的hashcode,放到指定位置,看数组中是否有元素,无元素直接放到数组元素上,有元素的话则进行(jdk1.8)尾插。

当一个数组元素下的链表长度超过8,就会触发treeifyBin(),

但是必须满足,数组的长度大于64,否则,只是就行resize()扩容,重新hash。 如果满足链表长度大于8,并且数组长度大于64,此时就把链表转换成红黑树(一种比较平衡的二叉搜索树)。 着里再讲一个设计remove()删除元素,当红黑树里的元素被删除到小于8的时候怎么办?其实这里有个过渡,不是8,而是如果红黑树里的元素删除的小于6的时候就会触发收缩检测。

此时就会红黑树收缩回链表了。

三.数组初始化

前面 put里提到过,初始new HashMap() 默认大小是16,可以指定数组大小,但是一定是2的幂。如 new HashMap(30),那么数组的大小就为32了。这个都很好理解。

四.扩容

负载因子 = 添加的元素 / hash表的长度

这个值默认是 0.75 ( jdk1.8)(可以根据实际需求调整,当值越大hash冲突概率就高,查询效率低,节省了空间,反之相反),当超过0.75,就会触发resize(),进行数组的扩容。

到此这篇关于深入解析HashMap的put方法的文章就介绍到这了,更多相关HashMap put方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot中的RestTemplate使用详解

    springboot中的RestTemplate使用详解

    这篇文章主要介绍了springboot中的RestTemplate使用详解,RestTemplate继承自InterceptingHttpAccessor并且实现了RestOperations接口,其中RestOperations接口定义了基本的RESTful操作,这些操作在RestTemplate中都得到了实现,需要的朋友可以参考下
    2023-09-09
  • 基于jenkins上配置Credentials的2种方式

    基于jenkins上配置Credentials的2种方式

    这篇文章主要介绍了基于jenkins上配置Credentials的2种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 基于SpringBoot整合oauth2实现token认证

    基于SpringBoot整合oauth2实现token认证

    这篇文章主要介绍了基于SpringBoot整合oauth2实现token 认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Spring Boot如何使用EhCache演示

    Spring Boot如何使用EhCache演示

    这篇文章主要介绍了Spring Boot如何使用EhCache演示,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java Lambda表达式详解

    Java Lambda表达式详解

    这篇文章主要介绍了Java Lambda表达式详解,包括了Java Lambda表达式创建线程,Java Lambda表达式的语法,Java lambda遍历List集合,Java lambda过滤String需要的朋友可以参考下
    2023-02-02
  • SpringBoot之使用Feign实现微服务间的交互

    SpringBoot之使用Feign实现微服务间的交互

    这篇文章主要介绍了SpringBoot中使用Feign实现微服务间的交互,对微服务这方面感兴趣的小伙伴可以参考阅读本文
    2023-03-03
  • SpringBoot配置主从数据库实现读写分离

    SpringBoot配置主从数据库实现读写分离

    现在的 Web 应用大都是读多写少,本文主要介绍了SpringBoot配置主从数据库实现读写分离,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Java 实战项目之CRM客户管理系统的实现流程

    Java 实战项目之CRM客户管理系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现一个CRM客户管理系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • 详解IDEA自定义注释模板(javadoc)

    详解IDEA自定义注释模板(javadoc)

    这篇文章主要介绍了详解IDEA自定义注释模板(javadoc),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 详解SpringBoot迭代发布JAR瘦身配置

    详解SpringBoot迭代发布JAR瘦身配置

    这篇文章主要介绍了详解SpringBoot迭代发布JAR瘦身配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08

最新评论