JDK成长记7:3张图搞懂HashMap底层原理!

JDK成长记7:3张图搞懂HashMap底层原理!

HashMap基本原理和优缺点

HashMap基本原理和优缺点

一句话讲, HashMap底层数据结构,JDK1.7数组+单向链表、JDK1.8数组+单向链表+红黑树。

HashMap的3个底层原理

HashMap的3个底层原理

在看过了ArrayList、LinkedList的底层源码后,相信你对阅读JDK源码已经轻车熟路了。除了List很多时候你使用最多的还有Map和Set。接下来我将用三张图和你一起来探索下HashMap的底层核心原理到底有哪些?

这一节我们就不一步一步带着大家看源码,直接通过3张源码原理图,给大家讲解HashMap原理图。有了之前的经验,相信你应该有能力自己看懂原理和自己画图了。

首先你应该知道HashMap的核心方法之一就是put。我们带着如下几个问题来看下图:

*
hash值计算的算法是什么?就是key.hashCode()吗?
默认情况下,put第一个元素时候容量大小是多少?扩容阈值又是多少?
– *hash寻址如何进行的?

JDK成长记7:3张图搞懂HashMap底层原理!

如上图所示,put方法调用了putVal方法,之后主要脉络是:

  1. 第一步调用了hash方法计算hash值。
  2. 第二步计算容量和扩容
  3. 第三步创建元素

如何计算hash值?

计算hash值的算法就在第一步,如图所示,对key值进行hashCode()后,对hashCode的值进行无符号右移16位和hashCode值进行了异或操作。为什么这么做呢?其实涉及了很多数学知识,简单的说就是尽可能让高16和低16位参与运算,可以减少hash值的冲突(数据结构算法课中可能叫散列碰撞)。

默认容量和扩容阈值是多少?

如上图所示,很明显第二步回调用resize方法,获取到默认容量为16,这个16在源码里是1<

Original: https://www.cnblogs.com/fanmao/p/15422473.html
Author: _繁茂
Title: JDK成长记7:3张图搞懂HashMap底层原理!

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/572620/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java学习-第一部分-第二阶段-第三节:异常

    异常 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 运行下面的代码,看看有什么问题->引出异常和异常处理…

    Java 2023年6月16日
    0104
  • SQLServer2019安装教程图文详解

    可以去官网下载,我百度网盘也有都一样 链接: https://pan.baidu.com/s/1fhEJu_9Zas364bvlEimRLA 提取码: wnqq 链接: https…

    Java 2023年6月5日
    0121
  • jvm

    双亲委派机制 什么是类加载器? 类加载器是jre的一部分,负责动态将类添加到Java虚拟机。 类加载分类 1、启动类加载器 bootstrap classloader :加载jre…

    Java 2023年6月13日
    076
  • Springboot整合mybatisPlus+Swagger3.0

    1. SpringBoot+Mybatis+MybatisPlus com.baomidou mybatis-plus-boot-starter 3.5.1 org.mybatis…

    Java 2023年6月8日
    079
  • gdb–多线程

    改配置, 设为只有一个work线程. 查看所有线程的bt状态(每个线程运行到何处了) thread apply all bt 根据1中的信息, 找到work线程, attach上去…

    Java 2023年5月29日
    074
  • 设计模式 《head first 设计模式》

    策略设计模式:strategy pattern 定义了算法族,分别封装起来,让他们之间可以互相替换。 此模式让算法的变化独立于算法的客户类 客户类,以 接口定义的 实例变量作其域,…

    Java 2023年6月9日
    0181
  • 抓到Dubbo异步调用的小BUG,再送你一个贡献开源代码的机会

    hello,大家好呀,我是小楼。 最近一个技术群有同学at我,问我是否熟悉Dubbo,这我熟啊~ 他说遇到了一个Dubbo异步调用的问题,怀疑是个BUG,提到BUG我可就不困了,说…

    Java 2023年6月6日
    082
  • mybatis plus + druid多数据源(使用dynamic实现)

    引入pom: 配置文件yml中: 用法:在相应service类或方法上添加DS注解,如: Original: https://www.cnblogs.com/007sx/p/134…

    Java 2023年5月30日
    084
  • CentOS系统在不重启的情况下为虚拟机添加新硬盘

    用过虚拟机的都知道,如果在系统运行的时候去给虚拟机添加一块新设备,比如说硬盘,系统是读取不到这个新硬盘的,因为系统在启动的时候会去检测硬件设备。但是我们也可能会遇到这样的情况,比如…

    Java 2023年5月30日
    087
  • Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!

    之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类、mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能。mybatis 插件…

    Java 2023年5月30日
    088
  • 网关Zuul、Gateway、nginx的区别

    zuul:是Netflix的,早期在微服务中使用较广泛,是基于servlet实现的,阻塞式的api,不支持长连接。只能同步,不支持异步。不依赖spring-webflux,可以扩展…

    Java 2023年5月30日
    077
  • Redis 分布式锁

    单机架构下,一个进程中的多个线程竞争同一共享资源时,通常使用 JVM 级别的锁即可保证互斥,以对商品下单并扣库存为例: public String deductStock() { …

    Java 2023年6月8日
    075
  • Oracle SQL Developer 安装

    参考资料 说在前面 什么是 SQL Developer? window 7 安装步骤 官方推荐配置 1 下载安装包 2 解压 3 启动 其他 1 如何找到其他版本的安装包下载页面?…

    Java 2023年6月9日
    094
  • es篇-es基础

    点赞再看,养成习惯,微信搜索「 小大白日志」关注这个搬砖人。 文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。 es和solr一样,都是基于Lucene的全文检索…

    Java 2023年6月8日
    079
  • BlogJava好像不能贴图

    BlogJava好像不能贴图,就贴在这里了. Original: https://www.cnblogs.com/sunsonbaby/archive/2005/05/05/149…

    Java 2023年5月29日
    082
  • JavaWeb-Tomcat阀

    Filter的功能之一就是预处理客户请求,而 Tomcat阀是对 Catalina容器接收到的 HTTP请求进行预处理. 过滤器实在 Servlet规范中提出来的,因此适用于所有的…

    Java 2023年5月29日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球