达到负载因子设定阈值时的情况

HashMap 有两个重要参数:初始容量(默认 16)和负载因子(默认 0.75)。当 HashMap 中存储的键值对数量超过了容量与负载因子的乘积(即阈值,threshold = capacity * loadFactor),就会触发扩容操作。

触发扩容主要是为了保证 HashMap 的性能。随着元素不断增加,哈希冲突发生的概率会上升,链表或红黑树会变长,查找、插入和删除操作的时间复杂度会变高。通过扩容可以增加桶的数量,减少哈希冲突,使元素分布更均匀,维持操作的时间复杂度接近 O (1)。

扩容的过程

HashMap 的扩容过程主要分为以下几个步骤:

创建新数组:容量变为原来的 2 倍。例如,原本容量为 16,扩容后变为 32。

重新计算阈值:根据新的容量和负载因子重新计算阈值。

元素迁移:遍历原数组的每个桶,将其中的元素重新分配到新数组中。这里又分为以下几种情况:

单个节点:如果桶中只有一个节点,直接根据新的哈希值和新数组长度计算新的位置并放入。

链表节点:如果桶中是链表,遍历链表,根据元素的哈希值和新数组长度计算每个元素在新数组中的位置,将链表拆分为两个链表,分别放入新数组的不同位置。

树节点:如果桶中是红黑树,将树拆分为两个树或者链表(如果拆分后节点数量小于 6,会将红黑树转换回链表),再放入新数组的不同位置。

以下是简化的 Java 代码示例,展示了 HashMap 扩容的大致逻辑:

import java.util.HashMap;

public class HashMapResizeExample {
public static void main(String[] args) {
// 创建一个初始容量为 4 的 HashMap
HashMap<Integer, String> map = new HashMap<>(4);
// 不断添加元素,触发扩容
for (int i = 0; i < 10; i++) {
map.put(i, "Value " + i);
System.out.println("Size: " + map.size() + ", Capacity: " + tableSizeFor(map.size()));
}
} // 模拟获取 HashMap 的容量
static final int tableSizeFor(int cap) {
int n = -1 >>> Integer.numberOfLeadingZeros(cap - 1);
return (n < 0) ? 1 : (n >= 1 << 30) ? 1 << 30 : n + 1;
}
}

当 HashMap 的容量达到负载因子设定的阈值时,会发生什么?扩容的过程是怎样的?的更多相关文章

  1. java基础 - 什么是hashmap的负载因子,hashmap的容量(即桶个数)为什么是2的幂次

    HashMap的负载因子是指,比如容量为16,负载因子为0.75,则当HashMap的元素个数达到16*0.75=12时,触发扩容.(16和0.75是初始默认的容量和负载因子). HashMap的容量 ...

  2. 面试这么撩准拿offer,HashMap深度学习,扰动函数、负载因子、扩容拆分,原理和实践验证,让懂了就是真的懂!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 得益于Doug Lea老爷子的操刀,让HashMap成为使用和面试最频繁的API,没 ...

  3. 我说HashMap初始容量是16,面试官让我回去等通知

    众所周知HashMap是工作和面试中最常遇到的数据类型,但很多人对HashMap的知识止步于会用的程度,对它的底层实现原理一知半解,了解过很多HashMap的知识点,却都是散乱不成体系,今天一灯带你一 ...

  4. HashMap负载因子

    下面是HashMap的一个构造函数,两个参数initialCapacity,loadFactor 这关系HashMap的迭代性能. /** * Constructs an empty <tt&g ...

  5. 关于HashMap中的负载因子

    这两天在看HashMap的时候,被负载因子float loadFactor搞得很晕,经过一天的研究,最后理出了自己的一点个人见解. 在HashMap的底层存在着一个名字为table的Entry数组,在 ...

  6. HashMap负载因子为什么是0.75

    待写 HashMap负载因子为什么是0.75?HashMap有一个初始容量大小,默认是16static final int DEAFULT_INITIAL_CAPACITY = 1 << ...

  7. 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?

    在Java基础中,集合类是很关键的一块知识点,也是日常开发的时候经常会用到的.比如List.Map这些在代码中也是很常见的. 个人认为,关于HashMap的实现,JDK的工程师其实是做了很多优化的,要 ...

  8. coding++:java-HashMap的负载因子为什么默认是0.75?

    本篇文章基于JDK1.8,特在此说明 1):负载因子的作用 负载因子是和扩容机制有关的,意思是如果当前容器的容量,达到了我们设定的最大值,就要开始执行扩容操作.举个例子来解释,避免小白听不懂: 比如说 ...

  9. HashMap的容量大小增长原理(JDK1.6/1.7/1.8)

    . 前言 HashMap的容量大小会根据其存储数据的数量多少而自动扩充,即当HashMap存储数据的数量到达一个阈值(threshold)时,再往里面增加数据,便可能会扩充HashMap的容量. 可能 ...

  10. HashMap初始化容量过程

    集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生.在日常开发中,我们经常会像如下方式以下创建一个HashMap: Map&l ...

随机推荐

  1. Mac Adobe Photoshop 2025 安装与激活保姆级教程

    为什么选择Photoshop? 作为全球顶尖的图像处理软件,Adobe Photoshop凭借其强大的功能和生态兼容性,成为设计师.摄影师.创意工作者的必备工具.本文以最新版Photoshop 202 ...

  2. Kubernetes初学乍练(资源管理)

    1.资源管理介绍 在Kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理Kubernetes.怎么理解,就好比我们常说的面向对象语言,一切皆对象. Kubernetes的本质就是 ...

  3. 一文搞懂K8s中的RBAC认证授权

    概述 官方文档: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/authorization/ https://kubern ...

  4. 手把手教你网络爬虫(爬取豆瓣电影top250,附带源代码)

    概念 网络爬虫就是按照一定的规则,自动抓取互联网信息的程序或脚本.其本质就是模拟浏览器打开网页,获取网页中我们需要的数据. 基本流程 准备工作(构建流程) 获取数据 解析内容 保存数据 1. 准备工作 ...

  5. python爬虫基本学习——函数

    函数 概念:编写程序时,需要某块代码多次,为了提高编写效率和代码的重用,把具有独立功能的代码块组织为一个小模块,即函数. 代码练习 ''' #函数的定义 def printinfo(): print( ...

  6. vue模板语法中能否用??的三目运算简写的问题

    使用双问号(??)的三目运算可以在 JavaScript 中使用,但在 Vue 模板语法中不支持.Vue 模板语法中的三目运算仍然使用单个问号(?)和冒号(:)的标准形式.例如: {{ conditi ...

  7. 构建基于Serverless架构的向量检索MCP Server

    构建基于Serverless架构的向量检索MCP Server 随着LLM与Agent的快速发展,向量检索成为构建高效语义搜索和智能推荐系统的关键技术之一.OpenSearch Service 作为一 ...

  8. HarmonyOS运动开发:深度解析文件预览的正确姿势

    鸿蒙核心技术##运动开发##Core File Kit(文件基础服务)##Preview Kit(文件预览服务)# 在 HarmonyOS 开发中,文件预览功能是一个常见的需求,尤其是在处理用户上传的 ...

  9. 支付宝携手HarmonyOS SDK实况窗,开启便捷停车生活

    6月,华为开发者大会2025与全球开发者一起,用代码和创新编制智慧时代的经纬.这里不仅是技术峰会,更是开发者的「主场」,6月21日,<HarmonyOS SDK使能高效开发,打造优质创新应用体验 ...

  10. C#学习日志

    C#入门篇 EanoJiang/CSharp-: C#入门教程,自用 程序思维题: 两根不均匀的香,烧完一根是1h,怎么用来计时15min呢? 思路:一根香从两头同时点燃烧完是30min,只需再对半即 ...