当前位置: 首页 > news >正文

面试题:为什么HashMap 使用的时候指定容量?

文章目录

  • 前言
  • 正文
    • 为什么要指定容量?


前言

其实可以看到我写了这么久的博客,很少去写hashMap的东西。
为什么?因为这个东西感觉是java面试必备的,我感觉大家都看到腻了,所以一直没怎么去写hashMap相关的。

本篇内容:

  • 举例说明 HashMap 使用的时候指定容量 错误用法;
  • 源码走读,HashMap初始容量的 计算方式;
  • 源码走读扩容的点;
  • 正确应该怎么去用,一定要理解再用;
  • 一些杂谈。

提示:以下是本篇文章正文内容,下面案例可供参考

正文

不开玩笑,真的都知道指定容量,但是有些用对了,有些没用对。

在这里插入图片描述

为什么要指定容量?

这个原由,都不用说,阿里的java开发手册就说的很明白:

在这里插入图片描述

其实核心点,就是避免数据量慢慢增加,导致反复触发扩容,影响性能。

于是乎就很多错误的使用方式了(虽热影响不大):

错误理解使用示例 ① :
分页查询出来的数据,需要转换成 Map, 因为分页是固定了一页最多15条。

所以出现了这个代码:

Map<String, String> map = new HashMap<>(15);

或者是

Map<String, String> map = new HashMap<>(userPageList.size());

错误理解使用示例 ② :
类型type 有 4种, 要放到一个map里面,返回去。

所以出现了这个代码:

Map<Integer, String> map = new HashMap<>(4);

错误理解使用示例 ③:
一个参数map,里面想放2个参数。

所以出现了这个代码:

Map<String, String> map = new HashMap<>(2);

不多举例,其实这几个错误示例,都是错在指定容量的 值上。

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

默认 指定是 传入 16, 16* 0.75=12 , 所以扩容阈值是12 。

说到这里,大家应该知道为什么上面是错误用法了吧?

比如我们想 存 4个元素到Map, 我们为了避免后面触发扩容影响性能(其实元素少性能没多少影响), 就指定了 4 :

Map<Integer, String> map = new HashMap<>(4);

其实这样 4x0.75= 3 ,那么如果存放第四个元素的时候,就会触发扩容

在这里插入图片描述

这样就是违背了我们开始指定 的 4 的最初用意。

实战看看这个错误使用场景的情况:

同过反射,将capacity属性的权限拿到,可以直接打印出来看下capacity的变化,就知道是否触发了扩容:

public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {Map<String, String> map = new HashMap<>(4);Class<?> mapType = map.getClass();Method capacity = mapType.getDeclaredMethod("capacity");capacity.setAccessible(true);map.put("1", "第一个元素插入");System.out.println("capacity : " + capacity.invoke(map) + "    size : " + map.size());map.put("2", "第二个元素插入");System.out.println("capacity : " + capacity.invoke(map) + "    size : " + map.size());map.put("3", "第三个元素插入");System.out.println("capacity : " + capacity.invoke(map) + "    size : " + map.size());map.put("4", "第四个元素插入");System.out.println("capacity : " + capacity.invoke(map) + "    size : " + map.size());}

看下打印效果:

在这里插入图片描述

为什么,当size =3 ,也就是插入三个元素的时候还没变。

因为我们初始化容量值传入的 4, 4* 0.75 =3. 扩容阈值是 3!

在这里插入图片描述
当插入第四个元素的时候, 就超过了扩容阈值,所以触发了扩容,所以看的最后其实是进行了一次扩容,打印出来的capacity是 8.

那么我们应该传多少?

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

4/0.75 + 1 = 6.3333333

我们指定传6么?还是传 7 ?

指定6:

在这里插入图片描述
指定7:
在这里插入图片描述
指定6,7 都没区别好像, 值得庆祝的是,没有再次触发扩容。

那么为啥没区别呢?

在这里插入图片描述
HashMap会转换成大于该capacity 的第一个2的幂作为容量 。
所以传5,6,7,8 都是 8 ;

传9,10,11,12,13,14,15,16 都是 16 ;

好了不多啰嗦了, 最后再补一嘴, 默认指定容量,其实就是 内存换性能。

所以真正去使用指定容量的时候, 需要考虑:如果我是一个定时任务,允许跑1小时。。。我需要考虑性能么?

或者如果我服务内存很小,我是不是要对内存省吃俭用?

相关文章:

面试题:为什么HashMap 使用的时候指定容量?

文章目录 前言正文为什么要指定容量&#xff1f; 前言 其实可以看到我写了这么久的博客&#xff0c;很少去写hashMap的东西。 为什么&#xff1f;因为这个东西感觉是java面试必备的&#xff0c;我感觉大家都看到腻了&#xff0c;所以一直没怎么去写hashMap相关的。 本篇内容&…...

基于C/C++的UG二次开发流程

文章目录 基于C/C的UG二次开发流程1 环境搭建1.1 新建工程1.2 项目属性设置1.3 添加入口函数并生成dll文件1.4 执行程序1.5 ufsta入口1.5.1 创建程序部署目录结构1.5.2 创建菜单文件1.5.3 设置系统环境变量1.5.4 制作对话框1.5.5 创建代码1.5.6 部署和执行 基于C/C的UG二次开发…...

“第五十二天”

算术逻辑单元&#xff1a; 之前提过的运算器包括MQ,ACC,ALU,X,PSW&#xff1b;运算器可以实现运算以及一些辅助功能&#xff08;移位&#xff0c;求补等&#xff09;。 其中ALU负责运算&#xff0c;运算包括算术运算&#xff08;加减乘除等&#xff09;和逻辑运算&#xff08…...

Lvs+Nginx+NDS

什么是&#xff1f;为什么&#xff1f;需要负载均衡 一个网站在创建初期&#xff0c;一般来说都是只有一台服务器对用户提供服务 ​ 从图里可以看出&#xff0c;用户经过互联网直接连接了后端服务器&#xff0c;如果这台服务器什么时候突然 GG 了&#xff0c;用户将无法访问这…...

JavaWeb——Servlet原理、生命周期、IDEA中实现一个Servlet(全过程)

6、servlet 6.1、什么是servlet 在JavaWeb中&#xff0c;Servlet是基于Java编写的服务器端组件&#xff0c;用于处理客户端&#xff08;通常是Web浏览器&#xff09;发送的HTTP请求并生成相应的HTTP响应。Servlet运行在Web服务器上&#xff0c;与Web容器&#xff08;如Tomcat&…...

Android 12.0 ota升级之SettingsProvider新增和修改系统数据相关功能实现

1. 前言 在12.0的系统rom定制化开发中,在解决一些已经上线的bug后,进行ota升级的过程中,由于在SettingsProvider中新增了系统属性和修改某项系统属性值,但是在ota升级以后发现没有 更新,需要恢复出厂设置以后才会更改,但是恢复出厂设置 会丢掉一些数据,这是应为系统数据…...

python---for循环结构中的else结构(是同级关系)

为什么需要在for循环中添加else结构 循环可以和else配合使用&#xff0c; else下方缩进的代码指的是当循环正常结束之后要执行的代码。 强调&#xff1a; 循环 正常结束&#xff0c;else之后要执行的代码。 非正常结束&#xff0c;其else中的代码是不会执行的。&#xf…...

XLua中lua读写cs对象的原理

LuaCallCS 1. 传递C#对象到Lua XLua在C#维护了两个数据结构&#xff0c;ObjectPool和ReverseMap。 首次传递一个C#对象obj到Lua时&#xff0c;对象被加入到ObjectPool中&#xff0c;并为它创建一个唯一标识objId&#xff0c;建立obj和objId的双向映射。 ObjectPool: objId-…...

新手小白怎么选择配音软件?

现在的配音软件软件很多&#xff0c;各种类型的都比较多&#xff0c;对于新手小白来说不知该如何选择&#xff0c;今天就来给你分享几款好用的配音软件。不论是制作短视频还是制作平常音频都完全可以。 第一款&#xff1a;悦音配音 这是一款专业的视频配音软件&#xff0c;多端…...

linux查看硬件信息命令

文章目录 cpu内核版本内存硬盘主板服务器参考链接 cpu cat /proc/cpuinfo 一个物理CPU可以有1个或者多个物理内核&#xff0c;一个物理内核可以作为1个或者2个逻辑CPU。 物理CPU数就是主板上实际插入的CPU数量。 在Linux上cat /proc/cpuinfo&#xff0c;会打印每个cpu的信息 …...

TSINGSEE青犀省级高速公路视频上云联网方案:全面实现联网化、共享化、智能化

一、需求背景 随着高速铁路的建设及铁路管理的精细化&#xff0c;原有的模拟安防视频监控系统已经不能满足视频监控需求&#xff0c;越来越多站点在建设时已开始规划高清安防视频监控系统。高速公路视频监控资源非常丰富&#xff0c;需要对其进行综合管理与利用。通过构建监控…...

知识图谱相关的操作

微软生成自己的图谱&#xff1a;GitHub - microsoft/SmartKG: This project accepts excel files as input which contains the description of a Knowledge Graph (Vertexes and Edges) and convert it into an in-memory Graph Store. This project implements APIs to searc…...

【Javascript】json

目录 什么是json&#xff1f; 书写格式 json 序列化和反序列化 序列化 反序列化 什么是json&#xff1f; JSON(JavaScript Object Notation)是⼀种轻量级的数据交换格式&#xff0c;它基于JavaScript的⼀个⼦集&#xff0c;易于⼈的编写和阅读&#xff0c;也易于机器解析…...

零资源的大语言模型幻觉预防

零资源的大语言模型幻觉预防 摘要1 引言2 相关工作2.1 幻觉检测和纠正方法2.2 幻觉检测数据集 3 方法论3.1 概念提取3.2 概念猜测3.2.1 概念解释3.2.2 概念推理 3.3 聚合3.3.1 概念频率分数3.3.2 加权聚合 4 实验5 总结 摘要 大语言模型&#xff08;LLMs&#xff09;在各个领域…...

智能终端界面自动化测试操作工具 - Appium常见用法

1. Appium 是什么可以做什么&#xff1f; Appium 是一款开源的移动应用自动化测试框架&#xff0c;用于测试移动应用程序的功能和用户界面。它支持多种移动平台&#xff0c;包括 Android 和 iOS&#xff0c;可以使用多种编程语言进行脚本编写&#xff0c;如 Python、Java、Jav…...

结构体数组经典运用---选票系统

结构体的引入 1、概念&#xff1a;结构体和其他类型基础数据类型一样&#xff0c;例如int类型&#xff0c;char类型&#xff0c;float类型等。整型数&#xff0c;浮点型数&#xff0c;字符串是分散的数据表示&#xff0c;有时候我们需要用很多类型的数据来表示一个整体&#x…...

code too large

描述&#xff1a;比较尴尬&#xff0c;一个方法的代码接近10000行了&#xff0c;部署服务器的时候提示(java :code[255,21] too large),提示代码过长&#xff0c;无法运行。 查看了一下百度&#xff1a;解决的思路 JVM规范&#xff1a;「类或接口可以声明的字段数量限制在 655…...

vue中把弹出层.vue文件注册成组件供其他.vue文件调用的写法

背景&#xff1a;因弹出层多个页面的详情都是一样的&#xff0c;因此把弹出层定义成组件&#xff0c;多次调用 定义组件的过程中出现很多问题&#xff0c;因此再次记录最终成功的写法 一、 简单实现页面调用弹出层组件的打开弹出层方法&#xff1a; 1. 弹出层组件 (in…...

mac 查看GPU使用

首先搜索活动监视器 然后 点击窗口->gpu历史记录 记住不是立马出结果&#xff0c;而是 需要等半分钟左右的...

工业4.0的安全挑战与解决方案

在当今数字化时代&#xff0c;工业4.0已经成为制造业的核心趋势。工业4.0的兴起为生产企业带来了前所未有的效率和灵活性&#xff0c;但与之伴随而来的是一系列的安全挑战。本文将深入探讨工业4.0的安全挑战&#xff0c;并提供一些解决方案&#xff0c;以确保制造业的数字化转型…...

P1061 Jam 的计数法【洛谷算法习题】

P1061 Jam 的计数法 网页链接 P1061 Jam 的计数法 题目描述 Jam 是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数&#xff0c;而是使用小写英文字母计数&#xff0c;他觉得这样做&#xff0c;会使世界更加丰富多彩。 在他的计数法中&#xff0c;每个数字的位数都是相…...

Nomic-Embed-Text-V2-MoE实战:构建智能文档检索系统与MySQL集成

Nomic-Embed-Text-V2-MoE实战&#xff1a;构建智能文档检索系统与MySQL集成 1. 引言 想象一下&#xff0c;你所在的公司有成千上万份产品手册、技术文档和合同文件&#xff0c;它们散落在各个文件夹里&#xff0c;格式五花八门。当你想找一份关于“如何解决产品X在低温环境下…...

Volcano调度算法全解析:从DRF公平分配到Binpack节点装箱(含权重调优技巧)

Volcano调度算法深度实战&#xff1a;从DRF公平分配到Binpack节点装箱 在Kubernetes生态中&#xff0c;资源调度一直是决定集群效率和稳定性的核心环节。当你的业务从简单的Web服务扩展到AI训练、大数据处理等复杂场景时&#xff0c;原生Kubernetes调度器的局限性就会凸显——它…...

手把手教你用脉动阵列实现FIR滤波器:从理论到VLSI设计的完整流程

手把手教你用脉动阵列实现FIR滤波器&#xff1a;从理论到VLSI设计的完整流程 在数字信号处理领域&#xff0c;FIR滤波器因其线性相位特性和稳定性而广受欢迎。但当面对高性能、低功耗的应用场景时&#xff0c;传统实现方式往往难以满足需求。脉动阵列&#xff08;Systolic Arr…...

OpenPose终极指南:10分钟掌握人体姿态估计核心技术

OpenPose终极指南&#xff1a;10分钟掌握人体姿态估计核心技术 【免费下载链接】openpose 项目地址: https://gitcode.com/gh_mirrors/op/openpose 想要快速搭建专业级的人体姿态识别系统吗&#xff1f;OpenPose作为业界领先的开源姿态估计库&#xff0c;能够实时检测图…...

为什么你的Python 3.14 JIT始终未触发?揭开__pycache__/jit_profile.bin隐藏机制与企业级profile引导策略(仅3家头部云厂商公开的冷启动预热方案)

第一章&#xff1a;Python 3.14 JIT 编译器的演进逻辑与企业级定位Python 3.14 引入的原生 JIT&#xff08;Just-In-Time&#xff09;编译器并非对 CPython 的简单性能补丁&#xff0c;而是基于多年运行时分析与生产环境反馈重构的执行引擎。其核心演进逻辑聚焦于“渐进式优化”…...

告别‘OSError‘:手把手教你为transformers库设置离线/代理模式,稳定加载预训练模型

构建稳定高效的Hugging Face模型加载环境&#xff1a;从原理到实践 当你在深夜赶项目进度时&#xff0c;突然遇到那个令人窒息的红色报错——"OSError: Couldnt connect to https://huggingface.co"&#xff0c;这感觉就像在马拉松终点线前被绊倒。作为现代NLP开发的…...

使用MedGemma 1.5构建医疗知识问答社区的实践

使用MedGemma 1.5构建医疗知识问答社区的实践 1. 引言 医疗行业每天产生海量的专业知识和临床数据&#xff0c;但医生和医学研究者往往难以快速获取精准的医疗信息。传统的医疗知识检索方式效率低下&#xff0c;专业门槛高&#xff0c;让很多医疗工作者在紧急情况下无法及时获…...

老系统兼容Python解决方案:PythonVista版本支持与安装指南

老系统兼容Python解决方案&#xff1a;PythonVista版本支持与安装指南 【免费下载链接】PythonVista Python 3.9 installers that support Windows 7 SP1 and Windows Server 2008 R2 项目地址: https://gitcode.com/gh_mirrors/py/PythonVista 在企业环境和个人用户中&…...

5分钟实战指南:免费解锁海尔智能家居完整接入HomeAssistant方案

5分钟实战指南&#xff1a;免费解锁海尔智能家居完整接入HomeAssistant方案 【免费下载链接】haier 项目地址: https://gitcode.com/gh_mirrors/ha/haier 还在为海尔设备无法与其他智能家居系统联动而烦恼吗&#xff1f;想要打破品牌壁垒&#xff0c;实现全屋智能统一控…...