Java HashMap什么时候进行扩容呢?

2023-11-04

下文笔者讲述HashMap什么时间进行扩容的简介说明,如下所示:

HashMap进行扩容的时间点:
   1.put元素时,会触发resize方法在内部进行扩容,将把原来的数据rehash放进扩容后的桶中,
   2.数组的容量必须达到树化的容量的最小值默认64,才会进行树化,
      当当前数组的容量小于64则会触发扩容条件,从而调用resize方法然后又对已有的数据rehash迁移。
   3.添加完元素之后会判断当前容量是否达到了扩容阈值达到后还需要执行resize方法
final Node<K,V>[] resize() {
        Node<K,V>[] oldTab = table;
        int oldCap = (oldTab == null) ? 0 : oldTab.length;
        int oldThr = threshold;
        int newCap, newThr = 0;
        if (oldCap > 0) {
            if (oldCap >= MAXIMUM_CAPACITY) {
                threshold = Integer.MAX_VALUE;
                return oldTab;
            }
            else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
                     oldCap >= DEFAULT_INITIAL_CAPACITY)
                newThr = oldThr << 1; // double threshold
        }
        else if (oldThr > 0) // initial capacity was placed in threshold
            newCap = oldThr;
        else {               // zero initial threshold signifies using defaults
            newCap = DEFAULT_INITIAL_CAPACITY;
            newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
        }
        if (newThr == 0) {
            float ft = (float)newCap * loadFactor;
            newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?
                      (int)ft : Integer.MAX_VALUE);
        }
        threshold = newThr;
        @SuppressWarnings({"rawtypes","unchecked"})
        Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];
        table = newTab;
        if (oldTab != null) {
            for (int j = 0; j < oldCap; ++j) {
                Node<K,V> e;
                if ((e = oldTab[j]) != null) {
                    oldTab[j] = null;
                    if (e.next == null)
                        newTab[e.hash & (newCap - 1)] = e;
                    else if (e instanceof TreeNode)
                        ((TreeNode<K,V>)e).split(this, newTab, j, oldCap);
                    else { // preserve order
                        Node<K,V> loHead = null, loTail = null;
                        Node<K,V> hiHead = null, hiTail = null;
                        Node<K,V> next;
                        do {
                            next = e.next;
                            if ((e.hash & oldCap) == 0) {
                                if (loTail == null)
                                    loHead = e;
                                else
                                    loTail.next = e;
                                loTail = e;
                            }
                            else {
                                if (hiTail == null)
                                    hiHead = e;
                                else
                                    hiTail.next = e;
                                hiTail = e;
                            }
                        } while ((e = next) != null);
                        if (loTail != null) {
                            loTail.next = null;
                            newTab[j] = loHead;
                        }
                        if (hiTail != null) {
                            hiTail.next = null;
                            newTab[j + oldCap] = hiHead;
                        }
                    }
                }
            }
        }
        return newTab;
    }

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

Java HashMap什么时候进行扩容呢? 的相关文章

  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 微信小程序组件、web-view、h5之间交互

    目录结构 component index page index js index wcss index wxml index json pages index index wcss index wxml index js index jso
  • 设置VS编译选项使程序不需要带DLL在任意Windows系统上正常运行

    背景 初学编程的时候 那时使用的开发环境是VC6 0 使用VC6 0编译的控制台程序或者是DLL 直接编译出来就可以在其他平台上运行或是调用 不需要额外加载运行库DLL等等 使用VC6 0编译出来的MFC程序 编译的时候设置下在静态库中使用
  • vue2和vue3组件传值——父传子

    近期学习vue3的组件传值 发现和之前的vue2版本并没有什么区别 实现的思路都是一样的 文章底部我会用大白话叙述一下vue组件传值的思路过程 下面就一起学习vue的组件传值吧 不足之处大家多批评指正 vue2 父传子
  • [Sqlite] Java使用jdbc连接Sqlite数据库进行各种数据操作的详细过程

    前言 SQLite是遵守ACID 的关系型数据库管理系统 它包含在一个相对小的C库中 它是D RichardHipp建立的公有领域项目 不像常见的客户 服务器范例 SQLite引擎不是个程序与之通信的独立进程 而是连接到程序中成为它的一个主
  • 程序员的思考方式

    思考方式及状态进入 工作产出不是由写代码的效率决定的 一些不恰当的工作方法很大程度影响着你的产出 首先要问自己三个问题 我现在是一个什么水平 我想达到什么水平 我将怎样达到那个目标 这三个问题实际上是帮我们确定 现状 目标 实现路径 如果一
  • 数据结构-判断平衡二叉树(java)

    判断平衡二叉树 题目 力扣110题 解题思路 1 首先理解平衡二叉树的定义 使用Map存储每个节点的高度 2 求得当前节点的左右子树高度 若Map中左右子树高度已经求过 直接取得 若没有 通过递归计算高度并存入Map中 3 左右子树高度差
  • 前端 正则校验 手机号格式(电话和座机)

    最近项目需要对手机号格式进行校验 话不多说直接上代码 d 3 4 0 9 7 8 1 3 4 5 6 7 8 9 d 9 手机号 校验开头和总位数 座机校验开头
  • 通用定时器③-输入捕获(IC)

    输入捕获 Input Capture 输入捕获模式下 当通道输入引脚出现指定电平跳变时 当前CNT的值将被锁存到CCR中 可用于测量PWM波形的频率 占空比 脉冲间隔 电平持续时间等参数每个高级定时器和通用定时器都拥有4个输入捕获通道可配置
  • 从ISO 42010 软件架构描述标准提炼架构概要

    一 概念基础 概念基础包括 1 架构说明的概念模型 2 架构在生命周期中的角色 3 架构说明的使用 4 架构框架和架构说明语言 上图是 系统说明的上下文 一个系统位于一个环境中 环境决定了整个生命周期中施加于系统的所有影响 包括系统在 环境
  • gdb多线程、进程调试

    最近gdb调试主线程起的子进程不知该怎么做 搜索一番如下GDB多线程多进程调试 码农教程j j 1 follow fork mode 方法 2 attach 子进程方法GDB调试fork exec创建的子进程的方法 走看看 详细使用例子 我
  • ESP32S3系列--SPI主机驱动详解(一)

    一 目的 SPI是一种串行同步接口 可用于与外围设备进行通信 ESP32S3自带4个SPI外设 其中SPI0 SPI1内部专用 共用一组信号线 通过一个仲裁器访问外部Flash和PSRAM SPI2 3各自使用一组独立的信号线 开发者可以使
  • 阿里云 服务器 部署项目 连接 同一台服务器 mysql 数据库失败 Communications link failure

    现象描述 阿里云 服务器安装了mysql 数据库 在同一台服务器发布项目 本地电脑idea 启动项目 和cmd 启动项目都能正常启动 可以连接到数据库 本地电脑 navicat 也能访问阿里云数据库 连接信息配置如下 spring data
  • 如何列出PostgreSQL中的所有用户

    From the psql interface run the du command 在psql界面中 运行 du命令 This will give you the list of all users in the system plus
  • 堆的应用(堆排序、TOP - K问题)

    前言 时间复杂度 堆排序的最坏时间复杂度为 O n lg n TOP K问题的最坏时间复杂度为 O n lg k 前面我们学习了二叉树 以及堆的结构 也用顺序表的结构成功的把堆的结构一步一步的敲出来了 IT公司的吉祥 树 二叉树 堆 C语言
  • C#计算20902个汉字的拼音首字母

  • SSM 提示 http://java.sun.com/jsp/jstl/core] cannot be resolved in either web.xml or the jar files dep

    错误的jsp 页面
  • 计算机网络3——传输层(上)

    目录 一 概述 二 多路复用和多路分用 1 无连接分用 2 面向连接的分用 三 无连接传输协议UDP 四 可靠数据传输原理 1 Rdt 1 0 2 Rdt 2 0 3 Rdt 2 1和2 2 4 Rdt 3 0 五 流水线机制与滑动窗口协议
  • linux 结构体 aligned,__attribute__((__aligned__(n)))对结构体对齐的影响

    1 attribute 是什么 attribute 是GCC里的编译参数 用法有很多种 感兴趣可以阅读一下gcc的相关文档 这里说一下 attribute 对变量和结构体对齐的影响 这里的影响大概分为两个方面 对齐和本身占用的字节数的大小
  • ubuntu安装配置Nginx

    Nginx下载 Nginx官网下载页面 下载其中的Stable version 我这里是nginx 1 20 1 安装依赖库 sudo apt install libpcre3 libpcre3 dev zlib1g dev openssl
  • Java HashMap什么时候进行扩容呢?

    下文笔者讲述HashMap什么时间进行扩容的简介说明 如下所示 HashMap进行扩容的时间点 1 put元素时 会触发resize方法在内部进行扩容 将把原来的数据rehash放进扩容后的桶中 2 数组的容量必须达到树化的容量的最小值默认