HashMap实现原理:

JDK1.7:数组+单向链表(头插)

在并发情况下头插可能出现循环链表(死循环)问题。原因:因为头插,在新数组中链表的元素顺序发生了变化,

如上图,假设线程1在扩容,刚刚调整链表完毕;线程2的指针却指向的还是原来的元素。这时新数组链表中是1->2->3的指向,但是线程2却是调整(扩容)前的3->2指向

JDK1.8:数组+单向链表(尾插)+红黑树

HashMap中数组的大小有什么特点?

初始化时数组的容量是2的幂次方数,即16;

如果初始化时指定数组大小,比如17,则实际数组大小是>17的2的幂次方数,即32.

HashMap中如何计算数组下标?

HashMap的键值对组成了数组,数组就有下标索引问题。需要根据key来计算当前key-value在数组中的位置:

可以看到,通过哈希值和(数组长度-1)的与操作【位运算】(代替取余)来计算数组下标,这种位运算要求数组大小必须为2的幂次方。

奇数做位运算时,高位一定是0;奇数和哈希值做位运算,结果取决于哈希值的低位。

为何用二次哈希结果计算索引?为了让计算索引的hashcode值分布得更加均匀。

假设数组长度是10,现在有80个元素都有哈希冲突,理想情况是每个数组位,存1个元素+7个元素长度的链表。这就是分布均匀。

分布不均匀:某些链表非常长(被迫转换成红黑树),某些链表过短。

更多关于二次哈希移步

(JDK1.8为右移16位)

如何解决Hash冲突

上一篇文章有简单说明。

何时触发自动扩容机制

数组扩容因子=0.75

链表的长度>8 & 数组长度>=64,==>红黑树

红黑树生成时Node-->TreeNode的转变,同时会将单向链表转变成双向链表。

*本篇暂不阐述HashMap并发相关知识点。后续单独开新篇。

HashMap实现原理和自动扩容的更多相关文章

  1. C#深入研究ArrayList动态数组自动扩容原理

    1 void Test1() { ArrayList arrayList = new ArrayList(); ; ; i < length; i++) { arrayList.Add(&quo ...

  2. 数据结构 5 哈希表/HashMap 、自动扩容、多线程会出现的问题

    上一节,我们已经介绍了最重要的B树以及B+树,使用的情况以及区别的内容.当然,本节课,我们将学习重要的一个数据结构.哈希表 哈希表 哈希也常被称作是散列表,为什么要这么称呼呢,散列.散列.其元素分布较 ...

  3. HashMap自动扩容机制源码详解

    一.简介 HashMap的源码我们之前解读过,数组加链表,链表过长时裂变为红黑树.自动扩容机制没细说,今天详细看一下 往期回顾: Java1.7的HashMap源码分析-面试必备技能 Java1.8的 ...

  4. 【Java基础】HashMap工作原理

    HashMap Hash table based implementation of the Map interface. This implementation provides all of th ...

  5. HashMap实现原理

    学习笔记之HashMap篇,简单学习了解HashMap的实现原理和扩容. 大家都知道HashMap处理数据很快,时间复杂度O(1),那么是怎么做到的呢?那就先了解一下常见数据结构. 一般来说,我们把存 ...

  6. Jdk1.8中的HashMap实现原理

    HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. HashM ...

  7. 理解HashMap的原理

    HashMap内部数据结构        HashMap内部采用数组和链表结合的方式来存取数据(见下图).这种方式有什么好处呢? 我们知道,数组操作对于检索是O(1)的,能够很快的根据数组的下标定位对 ...

  8. HashMap实现原理及源码分析之JDK8

    继续上回HashMap的学习 HashMap实现原理及源码分析之JDK7 转载 Java8源码-HashMap  基于JDK8的HashMap源码解析  [jdk1.8]HashMap源码分析 一.H ...

  9. 【1】Jdk1.8中的HashMap实现原理

    HashMap概述 HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 内部实现 ...

  10. 详解 Java 8 HashMap 实现原理

    HashMap 是 Java 开发过程中常用的工具类之一,也是面试过程中常问的内容,此篇文件通过作者自己的理解和网上众多资料对其进行一个解析.作者本地的 JDK 版本为 64 位的 1.8.0_171 ...

随机推荐

  1. restfull风格传参

  2. windows代码获取系统硬件信息的两种方式

    欢迎访问我的个人博客:xie-kang.com 原文地址 目前windows有两种方式获取系统硬件信息: 1)通过GetSystemFirmwareTable API获取SMBIOS信息,一段含丰富信 ...

  3. SXSSFWorkbook 表格内换行

    起因 导出的excel需要在表格内换行,但搜索到的方法都实现不了我的需求,经同事搜查得知,这是POI的一个bug,已经在17年八月后被解决. 生成方式 pom依赖 <dependency> ...

  4. 从babel编译结果分析class的实现原理

    示例: class A { // 属性表达式 prop1 = 1; // get方法 get value() { console.log('Getting the current value!'); ...

  5. OSPF之Router id冲突

  6. MySQL:查询语句 case when then 的用法

    转载网址: https://blog.csdn.net/h123hlll/article/details/122366213

  7. 文件上传 upload-labs Pass 12-16

    Pass12 GET00%截断 审计源码 $is_upload = false; $msg = null; if(isset($_POST['submit'])){ $ext_arr = array( ...

  8. 一篇文章带你快速入门学习RPA

    大纲: 什么是RPA? RPA的应用领域有哪些? RPA机器人技术一般用于什么行业? RPA的市场需求是什么? RPA项目的实施过程? RPA的未来趋势怎么样?   什么是RPA?   RPA 全称& ...

  9. Yolov5——训练目标检测模型

    项目的克隆 打开yolov5官网(GitHub - ultralytics/yolov5 at v5.0),下载yolov5的项目: 环境的安装(免额外安装CUDA和cudnn) 打开anaconda ...

  10. 解放AI生产力——ComfyUI

    最近状态不好,所以这几天基本没干什么,就分享一下和AI绘画工作流有关的东西吧. 此前我都没有抱着一种教学的心态来写博客,因为我所掌握的东西实在太过简单,只要一说大家就会了,我害怕我在人群里失去自己的特 ...