Java开发手册中为什么建议初始化HashMap的容量大小,以及HashMap源码中相关参数(容量大小设置参数公式)说明

news2024/11/14 18:07:17

场景

Java开发手册中对于HashMap的推荐如下:

【推荐】集合初始化时,指定集合初始值大小。

说明:HashMap 使用 HashMap(int initialCapacity) 初始化,如果暂时无法确定集合大小,那么指定默认值(16)即可。

正例:

initialCapacity = (需要存储的元素个数 / 负载因子) + 1。

注意负载因子(即 loader factor)默认为 0.75,如果暂时无法确定初始值大小,请设置为 16(即默认值)。

反例:

HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素增加而被迫不断扩容,

resize()方法总共会调用 8 次,反复重建哈希表和数据迁移。

当放置的集合元素个数达千万级时会影响程序性能。

 

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

通过查看HashMap的源码,先看下其主要的成员变量

 

1、transient int size; 

记录了 Map 中 KV 对的个数。

2、final float loadFactor; 

装载因子,用来衡量 HashMap 满的程度。

loadFactor 的默认值为 0.75f  

static final float DEFAULT_LOAD_FACTOR = 0.75f;

3、int threshold;  临界值,当实际 KV 个数超过 threshold 时,HashMap 会将容量扩容,threshold =容量 * 加载因子。

4、除了以上成员变量,还有一个概念capacity,容量,如果不指定,默认容量是16。

其源码声明为

        /**
         * The default initial capacity - MUST be a power of two.
         */
        //static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

 

size指当前已经有多少元素,capacity指最多可以装多少元素。

5、默认情况下 HashMap 的容量是 16,但是,如果用户通过构造函数指定了一个数字作为容量,

那么 Hash 会选择大于该数字的第一个 2 的幂作为容量。

 

在初始化 HashMap 的时候,应该尽量指定其大小。尤其是当你已知 map 中存放的元素个数时。(《阿里巴巴 Java 开发规约》)

HashMap 的扩容条件就是当 HashMap 中的元素个数(size)超过临界值(threshold)时就会自动扩容。

在 HashMap 中,threshold = loadFactor * capacity。loadFactor 是装载因子,

表示 HashMap 满的程度,默认值为 0.75f,设置成0.75 有一个好处,那就是 0.75 正好是 3/4,而 capacity 又是 2 的幂。

所以,两个数的乘积都是整数。对于一个默认的 HashMap 来说,默认情况下,当其 size 大于 12(16*0.75) 时就会触发扩容。

为了验证初始化容量后的性能要高于默认容量,编写以下测试代码

        int count = 10000000;
        Map<Integer, Integer> map1 = new HashMap<>();

        try(Cost cost = new Cost()){
            for (int i = 0; i < count; i++) {
                map1.put(i,i);
            }
        }

        Map<Integer, Integer> map2 = new HashMap<Integer, Integer>((int) (count / 0.75 +1));

        try(Cost cost = new Cost()){
            for (int i = 0; i < count; i++) {
                map2.put(i,i);
            }
        }

注意这里的代码耗时统计的方式可以参考

Java实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(Spring AOP、AutoCloseable方式):

Java实战-基于JDK的LRU算法实现、优雅的实现代码耗时统计(Spring AOP、AutoCloseable方式)_霸道流氓气质的博客-CSDN博客

以上对比结果如下

 

从结果中可知,在已知HashMap中将要存放的KV个数的时候,设置一个合理的初始化容量可以有效的提高性能。

如果我们没有设置初始容量大小,随着元素的不断增加,HashMap 会发生多次扩容,

而 HashMap 中的扩容机制决定了每次扩容都需要重建 hash 表,是非常影响性能的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年前端面试题汇总-数据结构(链表)

1. 链表的概念 1.1. 链表的结构 在计算机里&#xff0c;不保存在连续存储空间中&#xff0c;而每一个元素里都保存了到下一个元素的地址的数据结构&#xff0c;我们称之为链表&#xff08;Linked List&#xff09;。链表上的每一个元素又可以称它为节点&#xff08;Node&…

【大数据之Hive】六、Hive之metastore服务部署

metastore为Hive CLI或Hiveserver2提供元数据访问接口。 1 metastore运行模式 metastore运行模式有两种&#xff0c;嵌入式模式和独立服务模式。 &#xff08;1&#xff09;嵌入式模式 将metastore看作一个依赖嵌入到Hiveserver2和每一个HiveCLI客户端进程&#xff0c;使得Hi…

零基础开发小程序第六课-删除数据

目录 1 物理删除数据2 逻辑删除数据总结 我们上一篇介绍了修改数据&#xff0c;本篇介绍一下删除数据。一般的小程序如果提供给管理员使用的功能&#xff0c;通常会有删除数据的功能。 删除数据有真删除和假删除的区别。那什么是真删除呢&#xff1f;真删除就是把这条数据从数据…

通过JVM深入理解Java异常机制

JVM内部结构 要深入理解JVM异常处理机制&#xff0c;需要从JVM内部结构开始。 下图描述的主要是Java程序在执行时&#xff0c;由JVM管理的运行时数据区&#xff1b;包括方法区、Java堆、Java虚拟机栈、PC寄存器、本地方法栈&#xff0c;还有常量池。它们又被分为两大类——线程…

SeaTunnel StarRocks 连接器的使用及原理介绍

作者&#xff1a;毕博&#xff0c;马蜂窝数据平台负责人&#xff0c;StarRocks 活跃贡献者 & Apache SeaTunnel 贡献者 Apache SeaTunnel&#xff08;以下简称 SeaTunnel&#xff09;是一个分布式、高性能、易扩展、用于海量数据&#xff08;离线&实时&#xff09;同步…

Spring为什么默认是单例的?

目录 一、五种作用域 二、单例bean与原型bean的区别 三、单例Bean的优势与劣势 一、五种作用域 1.singleton: singleton是Spring Bean的默认作用域&#xff0c;也就是单例模式。在整个应用程序中&#xff0c;只会创建一个实例&#xff0c;Bean的所有请求都会共享这个实例。 …

ETLCloud轻松应对CDC实时数据流和维度数据合并的需求,实时监控订单数据

如何实现实时流与批流合并打宽数据 通常情况下我们使用CDC实时监听表销售或订单表数据的LOG时会形成流式的数据&#xff0c;即订单变化时数据是按照变化时间不断的传入到ETL的流程中的&#xff0c;业务希望实时看到订单数据的报表。 CDC每次传入的数据有可能是一条也可能是多…

基于geoserver开发地图发布服务

写在前面&#xff1a;我在github上创建了对应的项目&#xff0c;可点此跳转&#xff0c;本文的所有源码均可在项目里找到&#xff0c;欢迎大家访问交流 一、开发背景 在gis领域&#xff0c;geoserver是后端地图发布的开源项目。目前我们在启动服务后&#xff0c;可通过自带的…

科研工具-R-META分析与【文献计量分析、贝叶斯、机器学习等】多技术融合实践

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

【AIGC】14、GLIPv2 | 在 GLIP 上扩展 negative phrase 并新增分割功能

文章目录 一、背景二、方法2.1 A Unified VL Formulation and Architecture2.2 GLIPv2 pre-training2.3 将 GLIPv2 迁移到 Localization 和 VL task 三、结果3.1 One model architecture for all3.2 One set of model parameters for all3.3 GLIPv2 as a strong few-shot learn…

Latex使用algorithm2e包写伪代码

用Latex写伪代码我们需要用到一个包&#xff0c;Algorithm2e&#xff0c;这个工具包的使用手册下载地址为&#xff08;http://mlg.ulb.ac.be/files/algorithm2e.pdf&#xff09;CSDN的链接为&#xff08;&#xff09; 准备 导入该包 \usepackage[ruled,linesnumbered]{algor…

上海亚商投顾:沪指小幅震荡微涨 AI应用端持续活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 大小指数今日走势分化&#xff0c;沪指全天窄幅震荡&#xff0c;创业板指低开低走&#xff0c;盘中一度跌超1.6%&a…

【Java基础】I/O流 —— Java中的流都需要关闭吗?

目录 一、为什么要关闭流&#xff1f;二、close方法和flush方法1.使用close方法2.使用flush方法 三、流按指向分类四、不用关闭的流 一、为什么要关闭流&#xff1f; 涉及到对外部资源的读写操作&#xff0c;包括网络、硬盘等等的I/O流&#xff0c;如果在使用完毕之后不关闭&a…

Unity基础框架从0到1(六)对象池模块

索引 这是Unity基础框架从0到1的第六篇文章&#xff0c;框架系列的项目地址是&#xff1a;https://github.com/tang-xiaolong/SimpleGameFramework 文章最后有目前框架系列的思维导图&#xff0c;前面的文章和对应的视频我一起列到这里&#xff1a; 文章 Unity基础框架从0到…

算力不竭如江海,天翼云“息壤”如何助力千行百业算力智能调度?

科技云报道原创。 数字时代下&#xff0c;算力已成为新型生产力&#xff0c;并朝着多元泛在、安全可靠、绿色低碳的方向演进。以算力为核心的数字信息基础设施&#xff0c;是国家战略性布局的关键组成部分&#xff0c;也成为数字经济时代的“大国重器”。 作为云服务国家队&am…

报表生成器FastReport .Net教程:“Text“对象、文本编辑

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…

es elasticsearch 十四 各种机制 评分机制 正序索引 解决跳跃结果问题 解决耗时过长问题 解决相同属性值都到一个地方

目录 评分机制 机制 查看评分实现如何算出来的explaintrue 分析能否被搜索到 Doc value 正排序索引 Query phase Fetch phase Preference 问题 解决跳跃结果问题 Timeout 到达时间直接返回&#xff0c;解决耗时过长问题 Routing 数据准确分配到某地&#xff0c;解决相…

这才叫软件测试工程师,你那最多是混口饭吃罢了....

前些天和大学室友小聚了一下&#xff0c;喝酒喝大发了&#xff0c;谈天谈地谈人生理想&#xff0c;也谈到了我们各自的发展&#xff0c;感触颇多。曾经找工作我迷茫过、徘徊不&#xff0c;毕业那会我屡屡面试失败&#xff0c;处处碰壁&#xff1b;工作两年后我一度想要升职加薪…

006+limou+C语言“堆的实现”与“树的相关概念”

0.前言 这里是limou3434的一篇个人博文&#xff0c;感兴趣可以看看我的其他内容。本次我给您带来的是树的相关只是&#xff0c;并且把堆这一数据结构做了实现&#xff0c;后面还有大量的oj题目。但是树重点也就在这十多道oj题目中&#xff0c;您可以尝试着自己做一下&#xff…

我的创作纪念日|写在CSDN创作第512天

机缘 今天无意中发现CSDN后台给我发送私信&#xff0c;才发觉原来我的第一篇博客更新已经过去512天了&#xff0c;512天一晃而过居然还有点恍然。 作为一名网络专业的在校大学生&#xff0c;最初开始查找相关的资料其实更习惯于从外站进行查找&#xff0c;却总是在不经意中进入…