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. js指南

    1.for /in: 与for/of相比,可迭代对象不同,in后面可以是任意对象.数组.字符串.集合和映射可迭代. object.keys()   object.values()   object.e ...

  2. win10无管理员权限下以压缩包方式安装JDK8

    使用场景:如果在没有管理员权限的情况下,无法运行.exe文件,可以使用这种方式安装,本次把JDK安装到D:\jdk-8u152 一:获取JDK8的压缩包 1.JDK8 华为镜像地址 2.将下载好的ex ...

  3. IDEA 文件夹下无法新建java class文件问题处理:

    主要问题 1 未设置为源文件夹. 2 包名中包含关键字,也无法创建. 解决方式 1 文件夹右键---Mark Directory as----Test Sources Root 即可. 2 重命名

  4. JS和PHP中能转为布尔false的值的对比

    实际开发中经常会使用到JS和PHP中的变量转布尔值进行条件判断,下面对两种语言中转布尔类型结果为false的值进行对比,加深记忆和方便引用. 除了下表列出项,其它的值均转成真值true . 转布尔值后 ...

  5. springboot-项目获取resources下文件

    背景: 项目的resources 目录下放置了一份txt文件,需求是想获取到这份文件转成File对象,调用文件上传的接口进行文件上传操作. 实现: 1.使用 ResourceUtils:本地ok,测试 ...

  6. Python常见面试题013.请说出下面的代码返回结果是什么?

    013.请说出下面的代码返回结果是什么? *的坑:简单题 参考:https://docs.python.org/zh-cn/3.9/library/stdtypes.html#typesseq 示例代 ...

  7. IDEA: 如何导入项目模块 以及 将 Java程序打包 JAR 详细步骤

    IDEA: 如何导入项目模块 以及 将 Java程序打包 JAR 详细步骤 . @ 目录 IDEA: 如何导入项目模块 以及 将 Java程序打包 JAR 详细步骤 IDEA 导入项目模块 Modul ...

  8. Android笔记--如何在Android studio里面打开数据库

    具体操作 可参考这篇(更为详细): https://www.cnblogs.com/liuzijin/p/17029231.html 1.找到界面内的Device File Explorer 这里找可 ...

  9. springboot实现验证码功能

    实现验证码功能 先在utils包下创建一个ValidateImageCodeUtils.class package com.wfszmg.demo.utils; import javax.imagei ...

  10. 基于el-cascader级联选择器实现只有最后一级可以多选(已发布到npm & github)

    github地址:地址 背景: 我们经常级联合选择器多选的需求,但是element UI提供的级联选择器并不能只多选最后一级,所以我考虑基于element UI的级联选择器优化一下,实现可以多选最后一 ...