HashMap的扩容机制

2023-11-11

目录

一、HashMap的底层

二、HashMap的扩容机制原理

1、JDK1.7版本扩容

2、JDK1.8版本扩容

三、HashMap底层JDK1.7到JDK1.8的变化


一、HashMap的底层

底层:采用数组+链表(JDK1.7),采用数组+链表+红黑树(JDK1.8)。线程不安全。

容器:HashMap默认容器长度为16,扩容因子为0.75,以2的n次方扩容,最高可扩容30次。如第一次是长度达到16*0.75=12的时候开始扩容,16*2^1=32。

二、HashMap的扩容机制原理

1、JDK1.7版本扩容

①:先生成新数组;

②:遍历老数组中的每个位置上的链表上的每个元素;

③:获取每个元素的key,并基于新数组长度,计算出每个元素在新数组中的下标;

④:将元素添加到新数组中去;

⑤:所有元素转移完之后,将新数组赋值给HashMap对象的table属性。

2、JDK1.8版本扩容

①:先生成新数组;

②:遍历老数组中的每个位置上的链表或红黑树;

③:如果是链表,则直接将链表中的每个元素重新计算下标,并添加到新数组中去;

④:如果是红黑树,则先遍历红黑树,先计算出红黑树中每个元素对应在新数组中的下标位置;

a:统计每个下标位置的元素个数;

b:如果该位置下的元素个数超过了8,则生成一个新的红黑树,并将根节点添加到新数组的对应位置;

c:如果该位置下的元素个数没有超过8,那么则生成一个链表,并将链表的头节点添加到新数组的对应位置;

⑤:所有元素转移完了之后,将新数组赋值给HashMap对象的table属性。

三、HashMap底层JDK1.7到JDK1.8的变化

1、JDK1.8相较与JDK1.7在数组+链表的基础上添加了红黑树,加红黑树的目的时提高HashMap插入和查询的整体效率;

2、JDK1.7中链表插入采用的是头插法,JDK1.8中插入使用的是尾插法,因为JDK1.8中插入key和value时需要判断链表元素个数,所以需要遍历链表统计链表元素个数,所以正好直接使用尾插法;

3、JDK1.7哈希算法比较复杂,存在各种右移与异或运算,JDK1.8进行了简化,因为复杂的哈希算法目的就是提高散列性,来提供HashMap的整体效率,而1.8新增了红黑树,所以可以适当的简化哈希算法,节省CPU资源。

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

HashMap的扩容机制 的相关文章

  • Java-线程与CPU的关系

    我对多线程还很陌生 我正在开发一个项目 尝试在我的 Java 程序中使用 4 个 CPU 我想做类似的事情 int numProcessors Runtime getRuntime availableProcessors ExecutorS
  • 实现与扩展:何时使用?有什么不同?

    请用易于理解的语言进行解释或提供某些文章的链接 extends is for 延伸一类 implements is for 实施一个接口 接口和常规类之间的区别在于 在接口中您不能实现任何声明的方法 只有 实现 接口的类才能实现方法 C 中
  • 在Java中清空数组/处理

    除了循环遍历数组中的每个元素并将每个元素设置为 null 之外 Java 处理中是否有一个本机函数可以简单地清空数组 或销毁它 以便能够将其重新声明为新数组 There s Arrays fill myArray null 并不是说它执行的
  • 对 Java 中 *any* 类的所有实例进行全排序

    我不确定以下代码是否能确保 Comparator 的 Javadoc 中给出的所有条件 class TotalOrder
  • firebase推送通知错误Spring Boot服务器端

    我正在尝试从 Spring Boot 服务器端发送通知到客户端 android 服务器运行良好 一切都很好 2020 09 01 08 13 07 691 INFO 18941 restartedMain e DevToolsPropert
  • 初级 Java 计数器代码

    我的教授希望我这样做 使用下面的 Counter 接口写入多个可互换计数器 public interface Counter Current value of this counter int value Increment this co
  • 哈希码是否用于加速集合中的对象查找?

    IIUC 相同类型的两个不同对象可以存储在 HashSet 中 即使两个对象在以下情况下返回相同的值 hashCode 叫做 例如根据本文 https eclipsesource com blogs 2012 09 04 the 3 thi
  • 用 java 编写解释器时的 switch 或 if 语句

    当前的作业需要我编写一个程序 以一种非常微小且基本的编程语言 行为有点像 FORTRAN 来读取包含指令的文件并执行这些指令 基本上它是我猜的语言的简单解释器 它是完全线性的 所有语句都是按顺序定义的 并且只有字符串和整数变量 我需要查找和
  • Java 唤醒休眠线程

    我阅读了其他帖子 但没有找到我正在寻找的确切答案 所以我希望有人能给出一些澄清 我有一个将运行一段时间的程序 我有一些在后台运行的线程来执行各种任务 为了简单起见 让我们考虑 3 个线程 ThreadA每 10 秒执行一次任务 其中Thre
  • Java:使用 Java.util.concurrent 线程访问读取线程串行端口

    我正在尝试编写一个 Java 串行设备驱动程序并想使用 对我来说是新的 java util concurrent包裹 我有一种发送数据包然后等待 ACK 的方法 我打算有炭 接收在不同的线程中运行 如果接收线程收到 ACK 它应该使用发送数
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 是否可以为 azure blob 存储中的给定目录生成具有写入权限的 SAS(共享访问签名)

    我们的 blob 存储帐户结构 容器名称 simple 在这个容器内我们有 blob aa one zip aa two zip bb ss zip bb dd zip 是否可以生成对aa 目录 有写权限 但对bb 目录 没有访问权限的SA
  • 在服务器内部调用 Web 服务

    我有一个网络服务 getEmployee 当传递 id 时 它会获取单个员工的员工详细信息 同一服务器上的另一个 Web 服务 getEmployeeList 当传递一个部门时 它会获取整个员工列表 这将获取部门的 ID 然后调用 getE
  • 无法映射 ftl 文件中的 jsonRequest 属性

    我想在 FTL 文件中映射下面的 json 文件市场和子市场字段 但是当我尝试下面的代码时 它没有映射 有人可以帮助我吗 我从 2 天开始就无法映射它 Json请求 ProcessOrderRequest prevalidationMode
  • 读/写带有特殊字符的.txt文件

    I open Notepad Windows 并写 Some lines with special characters Special 并前往另存为 someFile txt 与Encoding set to UTF 8 在Java中我有
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • H2 - (相当)长的 INSERT 失败,错误 42000

    H2 内存中 插入 错误 42000 尝试过版本 1 4 196 1 4 197 1 4 199 我还尝试在 H2 服务器 本地 上执行 INSERT 也失败 给出错误的行 抱歉 但出于安全原因 我无法生成更多 INSERT INTO tb
  • 如果抛出RuntimeException,是否可以将其作为异常捕获?

    如果我有一个try抛出一个块RuntimException子类 可以是后续的catch块将其捕获为Exception 具体来说 public class MyAppException extends RuntimeException In
  • JMockit - 初始化问题

    当我使用以下测试时 我收到警告 警告 JMockit 是按需初始化的 这可能会导致某些测试失败 请检查文档以获取更好的初始化方法 这是我的测试实现 package test import static mockit Mockit impor
  • 如何从spark中的hbase表中获取所有数据

    我在 hbase 中有一个大表 名称为 UserAction 它具有三个列族 歌曲 专辑 歌手 我需要从 歌曲 列族中获取所有数据作为 JavaRDD 对象 我尝试了这段代码 但效率不高 有更好的解决方案来做到这一点吗 static Spa

随机推荐

  • 怎么判断map不为空

    示例代码 public static void main String args Map
  • (Oracle 基础篇) SQL 基础

    什么是SQL SQL 结构化查询语言 的主要功能就是在各种数据库建立联系 进行沟通 SQL语言分类 1 定义要在数据库存储那些信息的数据定义语言 DDL 主要针对对象 数据表 视图和索引 2 对数据库中的表进行操作的数据操作语言 DML 主
  • 视觉里程计2

    1 前言 为了克服特征点法的缺点 提出了以下几种思路 1 光流法 2 直接法 2 光流 2 1直接法 优化 最小化光度误差 实际上就是寻找全局像素误差总和最小的的情况 这种优化的理由仍然是灰度不变假设
  • Python函数练习题

    函数部分 1 编写一个名为collatz 的函数 它有一个名为number的参数 如果参数是偶数 那么collatz 就打印出number 2 如果number是奇数 collatz 就打印3 number 1 def collatz nu
  • javaee用户注册和登录界面源码

    JavaEE是一个企业级的 Java 应用程序开发平台 它提供了一组标准的技术和工具来帮助开发人员快速构建和部署企业级的 Java 应用程序 在 JavaEE 中 用户注册和登录界面可以使用 JSP Java Server Pages 技术
  • html文件存储服务,HTML5中五种存储方式的介绍

    本篇文章给大家带来的内容是关于HTML5中五种存储方式的介绍 有一定的参考价值 有需要的朋友可以参考一下 希望对你有所帮助 h5之前 存储主要是用cookies cookies缺点有在请求头上带着数据 大小是4k之内 主Domain污染 主
  • pandas.DataFrame.groupby 按某列类型值将文件分为多个文件

    1 groupby pandas DataFrame groupby groupby函数使用映射器或一系列列对数据帧进行分组 groupby操作涉及拆分对象 应用函数和组合结果的某种组合 这可以用于对大量数据进行分组 并对这些分组进行计算操
  • 若依开发时指定el-dialog局部显示的方法

    第一步 实例化一个 el dialog 最外面的div就是ei dialog要显示的位置 div div
  • ajax、axios、fetch之间的区别与联系

    整理ajax axios fetch优缺点 简单总结 JavaScript是一门前端语言 AJAX是一门技术 它提供了异步更新的机制 使客户端与服务器间交换数据而非整个页面文档 实现页面的局部更新 jQuery是一个框架 它对JavaScr
  • React - 路由 lazyLoad 的使用(路由懒加载)

    React 路由 lazyLoad 路由懒加载 lazy是React提供的懒 动态 加载组件的方法 React lazy 路由组件代码会被分开打包 能减少打包体积 延迟加载首屏不需要渲染的组件 依赖内置组件Suspense标签的fallba
  • scau oj 10848 2021-11-06

    18048 自由落体 时间限制 1000MS 代码长度限制 10KB 提交次数 0 通过次数 0 题型 编程题 语言 G GCC VC Description 一个球从100米的高度自由落下 每次落地后弹起的原来高度的一半 计算并输出第n次
  • 海思3861环境搭建

    开发环境 ubuntu18 04 DOPI3861开发板 Q群 735884031 一 安装编译工具 1 按照官方文档下载编译工具并添加到环境变量中 https device harmonyos com cn docs start intr
  • spring boot logback 配置

    为什么要使用logback 在开发中不建议使用System out因为大量的使用会增加资源的消耗 因为使用System out是在当前线程执行的 写入文件也是写入完毕之后才继续执行下面的程序 而使用Log工具不但可以控制日志是否输出 怎么输
  • git 合并不提交

    1 默认情况 默认合并 会执行commit 查看日志信息会有commit日志 2 合并不提交 勾选下面两个复选框 查看日志时 就不会有默认提交了 执行提交命令时 就会出现合并后的文件
  • Acwing 3. 完全背包问题

    暴力解法 完全背包每种物品都有无限个可用 include
  • elementui表格自定义表头的两种方法

    表格自定义表头的方式 多选框表头换文字 请查看上篇博客 http t csdn cn 69De2 文字换按钮 render header render header方法详情 Table column Attributes 参数 说明 类型
  • 时序预测

    MATLAB实现贝叶斯优化CNN GRU时间序列预测 股票价格预测 目录 MATLAB实现贝叶斯优化CNN GRU时间序列预测 股票价格预测 效果一览 基本介绍 模型搭建 程序设计 学习总结 往期精彩 参考资料 效果一览 基本介绍 MATL
  • 苹果系统itunes连iphone连不上服务器,iphone连不上itunes怎么办,iphone连不上itunes的解决办法...

    iPhone连不上iTunes怎么办 苹果手机连接不上iTunes的解决方法 iPhone手机虽然比较贵 但是使用的人也不少 作为一款区别于安卓系统的手机 它拥有更流畅的系统和更好的体验 但是有些果粉平时在操作手机时 有时需要通过连接itu
  • java/php/net/python网上订餐系统设计

    本系统带文档lw万字以上 答辩PPT 查重 如果这个题目不合适 可以去我上传的资源里面找题目 找不到的话 评论留下题目 或者站内私信我 有时间看到机会给您发 系统体系结构 网上订餐系统的结构图4 1所示 图4 1 系统结构 登录系统结构图
  • HashMap的扩容机制

    目录 一 HashMap的底层 二 HashMap的扩容机制原理 1 JDK1 7版本扩容 2 JDK1 8版本扩容 三 HashMap底层JDK1 7到JDK1 8的变化 一 HashMap的底层 底层 采用数组 链表 JDK1 7 采用