jdk1.8中HashMap的扩容,从新增第一个元素开始

2023-05-16

置灰部分在当前场景下不考虑

1.新增第一个元素

新增第一个元素总结:

先进行数组容量初始化,初始大小为16,扩容界限为12,再找出数组对应位置,将新增的值放入。


2.继续新增元素,假设一直不产生hash冲突

 

 

 

执行完一系列操作,也就完成了数组的扩容,【注:此处还未涉及到hash冲突】

不产生hash冲突总结:

当新增的元素达到了该扩容的界限,那么会触发扩容操作,先计算扩容后的大小,也就是原数组大小的两倍,然后创建一个新容量大小的数组,再进行原数组遍历依次定位后放入新数组中。

 

非树情况下产生hash冲突总结

先确定在数组中的位置,如果该位置上已经存在元素,再判断是否key相同,如果不相同,那么获取到该位置上的尾节点,将尾节点的next指向新增的节点。当达到新增完后,发现容量大小已经超过阈值,那么开始进行扩容,扩容先产生一个原数组两倍大小的新数组,再遍历原数组,

如果遍历到的位置只有一个节点,将该节点的hash值和(新数组容量大小值-1)进行&操作定位。

如果遍历的位置是链表结构,那么依次遍历链表到末尾,期间将节点的hash和原数组容量大小进行&操作,如果高位是0,则原位置不变,如果高位是1,则新位置=(当前位置+原数组容量大小)

 

整体步骤

1.创建hashMap,

2.新增第一个元素,先进行数组容量初始化,初始化大小为16,扩容触发的阈值为12,然后将元素插入该数组中。

3.后续依次加入元素,假如新增一直没有产生hash冲突,新增完后,判断大小却达到了阈值12,那么触发数组扩容。扩容大小为原大小的2倍,也就是32,阈值扩大两倍为24。然后进行元素的重定位【但其实只是个元素的hash和(容量大小-1的值)进行与操作,这样操作的话位置不变】。

4.然后如果一直新增元素,产生hash冲突,那么先找到冲突位置的首节点,然后将新增的节点挂在尾结点,当改链路下的长度>=8,且当下的数组大小还没超过64,那么先进行扩容操作,扩容就是遍历原数组,当元素只有一个节点,则如上描述的扩容走,当元素为链表,则对元素和原数组大小进行与操作,值要么是0,要么是原数组大小,所以,要么位置不变,要么位置在原基础上加上原数组大小。

5.然后又一直加元素,加到数组容量超过了64,且其中存在的链表结构长度>=8,则进行链表转红黑树的操作。其中,红黑树在扩容的时候,碰到深度<=6的会将其转回链表

 

注:

1.扩容元素时不需要重新计算hash值

2.满足链表转红黑树的两个条件

     数组大小>=64【容易忽略这一点】

     链表长度>=8

3.红黑树什么时候转回链表

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jdk1.8中HashMap的扩容,从新增第一个元素开始 的相关文章

  • 具有空键功能的线程安全映射

    我需要一个多线程 Map 对象在我的 Web 服务器的缓存中使用 并且我需要null keys HashMap允许我有空键 但是ConcurrentHashMap没有 我尝试创建一个同步版本HashMap using Collections
  • 如何使用stdext::hash_map?

    我想看一个如何正确重写 stdext hash compare 的简单示例 以便为我自己的用户定义类型定义新的哈希函数和比较运算符 我正在使用 Visual C 2008 这就是你可以做到的 class MyClass Hasher con
  • 如何使用 JSTL forEach 循环迭代 HashMap? [复制]

    这个问题在这里已经有答案了 在我的 Spring MVC 应用程序中 我从controllerServlet 返回了HashMap 现在我需要使用 JSTL 在我的 jsp 中打印它 请帮忙解决这个问题 我对这一切都是新手 尝试这个 假设我
  • 检查和删除 Java HashMap 中的元素

    我正在尝试使用 Java 中的 HashMap 检查并删除元素 它的键是我创建的称为 ClusterKey 的类型 它的值是我创建的称为 ClusterValue 的类型 这是导致问题的代码 ClusterKey ck new Cluste
  • HashMap 不可序列化

    HashMap with Serializable键 值应该是Serializable 但这对我不起作用 尝试了其他一些IO流 没有一个有效 有什么建议吗 测试代码 public class SimpleSerializationTest
  • 用数字替换符号

    我想读取一个文件并检测符号后面的字符是数字还是单词 如果是数字 我想删除它前面的符号 将数字翻译成二进制并替换在文件中 如果是一个单词 我想首先将字符设置为数字16 但随后 如果使用另一个单词 我想在原始数字上添加1 这就是我想要的 如果文
  • Java 中 null 对象的 hashcode 必须是什么?

    根据此评论post https stackoverflow com questions 11184041 how is hashcode calculated for null object hascode of null objects
  • Android 使用包含另一个 hashmap 的 hashmap 实现 Parcelable 对象

    这是一个扩展Android 实现具有 hashmap 的 Parcelable 对象 https stackoverflow com questions 22498746 android implement parcelable objec
  • C# Java HashMap 等效项

    从 Java 世界进入 C 世界 是否有一个 HashMap 等价物 如果不是你会推荐什么 Dictionary https learn microsoft com en us dotnet api system collections g
  • Android - 从HashMap中获取值

    我尝试在 Android 中搜索 HashMap 但出现问题 考虑这个例子 HashMap
  • Amazon S3s 密钥背后的数据结构(过滤数据结构)

    我想实现一个类似于 Amazon S3 的查找功能的数据结构 就上下文而言 Amazon S3 将所有文件存储在平面命名空间中 但允许您通过文件名中的公共前缀查找文件组 从而复制目录树的功能 但又不那么复杂 问题是 查找和过滤操作都是 O
  • 当客户端读取 HashMap 时如何刷新 HashMap

    我有一个静电HashMap在服务器启动时初始化 客户端在登录时从该地图初始化其数据 现在我需要刷新这张地图 但是客户端可以同时登录并从这张地图中获取数据 当他们阅读时 我可以更改如下所示的地图参考吗 我不能使用synchronized因为它
  • 查找数组中出现奇数次的所有元素

    我遇到了以下问题 查找数组中出现奇数次的所有元素 我对此的想法是 Use HashMap 将数组中的值添加为HashMap中的键 每个键对应的值将是遇到该键的次数 使用快速排序以 O N log N 的方式对数组进行排序 然后遍历数组以检查
  • 最坏情况时间复杂度 put/get HashMap

    当 Hashmap 的键的哈希码始终相等时 它的最坏情况时间复杂度是多少 根据我的理解 由于每个键都有相同的哈希码 因此它总是会进入同一个存储桶并循环遍历它以检查 equals 方法 因此对于 get 和 put 时间复杂度应该是 O n
  • Java中如何从HashMap中获取对象

    我试图在给定密钥时从 HashMap 获取测试对象的速度 但我不太确定该怎么做 我尝试过这种方式 但它是错误的 hash values getSpeed 有什么帮助吗 谢谢 class Test private String id priv
  • JAXB 将 XML 元素解组到 HashMap

    我发现很多文章描述了如何将 XML 元素序列解组到 HashMap 只要它们位于 父 元素内 但是 我无法将此与直接在根元素下的子元素一起使用 选项 1 有效
  • 二和 Leetcode 解释、Hashmap、Javascript

    我只是想知道谁能一步一步解释这个解决方案的算法 我不知道哈希图是如何工作的 您能否还提供一个使用哈希图的基本示例 以便我理解该算法 谢谢你 var twoSum function nums target let hash for let i
  • ANSI C 哈希表实现,数据位于一个内存块中

    我正在寻找一种哈希表的开源 C 实现 它将所有数据保存在一个内存块中 因此可以轻松地通过网络发送数据 我只能找到为添加到其中的每个键值对分配小块内存的内存 预先非常感谢您的所有投入 编辑 它不一定需要是哈希表 无论键值对表可能会做什么 序列
  • Java 中的 HashMap 和 Map 对象有什么区别?

    我创建的以下地图之间有什么区别 在另一个问题中 人们似乎可以互换使用它们来回答 我想知道它们是否 如何不同 HashMap
  • 在 Python 中进行模糊键查找的最佳方法?

    我遇到一个问题 我需要在哈希映射中进行模糊查找 即返回与最接近查询的键相对应的值 在我的例子中是通过 Levenshtein 距离测量的 我目前的方法是子类化dict使用特殊的查找方法计算所有键的编辑距离 然后返回得分最低的键的值 基本上是

随机推荐