1 背景

今天在代码审查的时候,发现一位离职的同事留下了这样一串代码:

Map<String,String> map = new HashMap<>((int)(list.size()/0.75F+1));

第一反应是:又在炫技,又在搞这些花里胡哨的东西。

但是看到0.75的我却陷入了沉思,稍微深入了解过Map的应该都知道,Map中有个属性,叫做负载因子,刚好默认也是0.75

负载因子的作用:减少Hash碰撞,假如初始容量设置为8,那么实际可容纳的元素是8*0.75=6,如果元素超过了6就会进行扩容

2 思考

虽然认出了0.75是负载因子的默认值,但是 list.size()/0.75F+1是什么意思还是不太明白,我就假如 list.size() 等于 16,带进去算,得到的初始值是22,由于Map会自动向上去冥整,所以最后得到的初始容量是32

如果使用平时自己的写法Map<String,String> map = new HashMap<>(list.size()),初始容量是16

看到这里,突然就明白了,初始容量是16的时候,显然是容纳不下16个元素的(实际只能容纳12个元素,超过12个就会进行扩容操作),而第一种写法,初始容量是32,就能避免扩容操作

3 总结

后来也查看了相关的资料,发现以前也有人讲过,也许是这点优化并不能带来很大的性能提升,所以都没有引起大家的注意,但是我认为这种随手就能提高一点系统性能的写法,可以是一个开发的好习惯。

HashMap设置初始容量一直都用错了?的更多相关文章

  1. Java中HashMap的初始容量设置

    根据阿里巴巴Java开发手册上建议HashMap初始化时设置已知的大小,如果不超过16个,那么设置成默认大小16: 集合初始化时, 指定集合初始值大小. 说明: HashMap使用HashMap(in ...

  2. 阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?

    集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 关于HashMap,很多人都对他有一些基本的了解,比如他和hashtab ...

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

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

  4. 为啥HashMap的默认容量是16?

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

  5. 为啥HashMap的默认容量是16

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

  6. .NET性能优化-你应该为集合类型设置初始大小

    前言 计划开一个新的系列,来讲一讲在工作中经常用到的性能优化手段.思路和如何发现性能瓶颈,后续有时间的话应该会整理一系列的博文出来. 今天要谈的一个性能优化的Tips是一个老生常谈的点,但是也是很多人 ...

  7. Java中HashMap 初始化时容量(参数)如何设置合适?

    问题引入 注:本文代码源自java 9. 阿里的插件对于初始化HashMap时,调用无参构造方法,提示如下: 那么问题来了,如果已知需要向 map 中 put n次,那么需要设定初始容量为多少? 单纯 ...

  8. ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量

    当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...

  9. ArrayList、Vector、HashMap、HashTable、HashSet的默认初始容量、加载因子、扩容增量

    这里要讨论这些常用的默认初始容量和扩容的原因是: 当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全 ...

  10. Java中间(三十五)-----Java详细设置(一个):请指定初始容量设置

    集合是我们在Java编程中使用很广泛的,它就像大海,海纳百川,像万能容器,盛装万物.并且这个大海,万能容器还能够无限变大(假设条件同意). 当这个海.容器的量变得很大的时候,它的初始容量就会显得很重要 ...

随机推荐

  1. DevEco Studio 3.1差异化构建打包,提升多版本应用开发效率

     原文:https://mp.weixin.qq.com/s/8XtgZ-k0mGXCjKHfSXFoOg,点击链接查看更多技术内容.     HUAWEI DevEco Studio是开发Harmo ...

  2. 深入解析decltype和decltype(auto)

    decltype关键字是C++11新标准引入的关键字,它和关键字auto的功能类似,也可以自动推导出给定表达式的类型,但它和auto的语法有些不同,auto推导的表达式放在"="的 ...

  3. c# 优化代码的一些规则——用委托表示回调[五]

    前言 委托为什么可以作为回调? 因为委托可以作为方法的参数. 正文 通过委托,是一种定义类型安全回调. 记得第一个接触委托的时候,是老师讲的,后来真正用的是完成学期项目,一个winform,委托作为事 ...

  4. mysql 重新整理——性能下降的原因[四]

    前言 什么是性能下降? 其实就是代码运行的环境变了,那么环境变化是什么? 比如cpu上升了,内存满了.有或者表中数量增加了,量变了. 其实这些是dba干的,但是呢,我们也需要去了解下,并且优化我们的c ...

  5. 单链表之删除头结点,查找等于定值x的结点数,单链表的逆置

    /* * @Author: 一届书生 * @Date: 2020-03-08 09:52:27 * @LastEditTime: 2020-03-08 13:58:30 */ #include < ...

  6. Locust、Jemter、Loadrunner三种工具的分布式压测

    前言: 最近公司接了一个云上展会项目,合同里签订的是6w并发连接数和2w QPS的性能指标,还有监理单位,第三方评测单位. 唉,先吐槽一下,有了监理和评测,文档tmd一堆堆,严格按照软件开发来执行,写 ...

  7. 力扣1132(MySQL)-报告的记录Ⅱ(中等)

    题目: 编写一段 SQL 来查找:在被报告为垃圾广告的帖子中,被移除的帖子的每日平均占比,四舍五入到小数点后 2 位. Actions 表: Removals 表: Result 表: 2019-07 ...

  8. 牛客网-SQL专项训练5

    ①查询运动员表中运动员的所有信息,按照年龄升序,成绩降序排列.SQL语句为: SELECT  *  FROM  运动员 ORDER 年龄 ASC, 成绩 DESC: 知识点: ASC:升序,默认就为升 ...

  9. 为 Serverless Devs 插上 Terraform 的翅膀,实现企业级多环境部署(下)

    简介: 在上篇中,主要介绍了 Serverless Devs 多环境功能的使用,用户读完可能会些疑问,本文会就一些常见问题进行下回答. 在上篇中,主要介绍了 Serverless Devs 多环境功能 ...

  10. 龙蜥开源Plugsched:首次实现 Linux kernel 调度器热升级 | 龙蜥技术

    ​简介:对于plugsched而言,无论是 bugfix,还是性能优化,甚至是特性的增.删.改,都可胜任. ​ 文/龙蜥社区内核开发人员 陈善佩.吴一昊.邓二伟 Plugsched 是 Linux 内 ...