当前位置: 首页 > 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;以确保制造业的数字化转型…...

如何查找特定基因集合免疫基因集 炎症基因集

温故而知新&#xff0c;再次看下Msigdb数据库。它更新了很多内容。给我们提供了一个查询基因集的地方。 关注微信&#xff1a;生信小博士 比如纤维化基因集&#xff1a; 打开网址&#xff1a;https://www.gsea-msigdb.org/gsea/msigdb/index.jsp 2.点击search 3.比如我对纤维…...

轮转数组(Java)

大家好我是苏麟 , 这篇文章是凑数的 ... 轮转数组 描述 : 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 题目 : 牛客 NC110 旋转数组: 这里牛客给出了数组长度我们直接用就可以了 . LeetCode 189.轮转数组 : 189. 轮…...

Spring体系结构

Spring体系结构 核心容器 核心容器由 spring-core&#xff0c;spring-beans&#xff0c;spring-context&#xff0c;spring-context-support和spring-expression&#xff08;SpEL&#xff0c;Spring 表达式语言&#xff0c;Spring Expression Language&#xff09;等模块组成&…...

PostgreSQL basebackup备份和恢复

一、概述 备份和恢复分为逻辑和物理&#xff0c;这里指物理备份和恢复。 PG的物理备份依赖basebackup&#xff0c;这差不多就是数据目录的拷贝&#xff0c;还依赖归档日志。 恢复分为完全恢复和PITR恢复&#xff0c;它们都需要归档日志&#xff0c;它们关键的差别是&#xf…...

XTU-OJ 1248-Alice and Bob

Alice和Bob在玩骰子游戏&#xff0c;他们用三颗六面的骰子&#xff0c;游戏规则如下&#xff1a; 点数的优先级是1点最大&#xff0c;其次是6,5,4,3,2。三个骰子点数相同&#xff0c;称为"豹子"&#xff0c;豹子之间按点数优先级比较大小。如果只有两个骰子点数相同&…...

第四章 文件管理 十、文件系统的全局结构

目录 一、文件系统的建立 1、原始磁盘 2、物理格式化后 3、逻辑格式化后 二、文件系统在内存中的结构 三、系统调用背后的过程 一、文件系统的建立 1、原始磁盘 2、物理格式化后 物理格式化&#xff0c;即低级格式化――划分扇区&#xff0c;检测坏扇区&#xff0c;并用…...

【PythonGIS】基于高德Api实现批量地址查询经纬度

之前因为同事需要几千个小区的经纬度信息&#xff0c;所以就帮同事写了一段Python代码&#xff0c;通过调取高德地图的api实现地址查询经纬度这个功能。对于如何使用经纬度查询地址的方法&#xff0c;我之前分享过博文&#xff1a;【Python入门教程】获取图片可视化精准定位&am…...

vue数组中的变更方法和替换方法

变更方法&#xff1a; Vue 能够侦听响应式数组的变更方法&#xff0c;并在它们被调用时触发相关的更新。这些变更方法包括: push&#xff08;&#xff09;:在数组末尾添加一个或者多个元素&#xff0c;返回新的长度。 var arr [1, 2, 3, 4, 5]; // 定义一个数组 arr.push(6…...

Java - 工具类参数初始化

在做第三方接口调用时&#xff0c;经常需要根据不同的环境指定初始化的参数。以下做一个简单的记录。 一、使用static初始化 使用static初始化&#xff0c;仅会初始化一次&#xff0c;但无法从配置文件中获取参数。并且如果写了多个初始化工具类&#xff0c;会互相覆盖。 /**…...

一文搞懂 MineCraft 服务器启动操作和常见问题 2023年10月

文章目录 前言1. 新建文件夹2. 创建 bat 文件3. 编辑 bat 文件4. 启动服务器5. 恭喜完成 文章持续更新中&#xff0c;如果你有问题可以通过 qq 1317699264 获取免费协助&#xff0c;解决的问题将会被更新到本文章中 前言 无论你是使用服务端整合包&#xff0c;还是从上一篇我的…...