HashMap设置初始容量一直都用错了?
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设置初始容量一直都用错了?的更多相关文章
- Java中HashMap的初始容量设置
根据阿里巴巴Java开发手册上建议HashMap初始化时设置已知的大小,如果不超过16个,那么设置成默认大小16: 集合初始化时, 指定集合初始值大小. 说明: HashMap使用HashMap(in ...
- 阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?
集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 关于HashMap,很多人都对他有一些基本的了解,比如他和hashtab ...
- 我说HashMap初始容量是16,面试官让我回去等通知
众所周知HashMap是工作和面试中最常遇到的数据类型,但很多人对HashMap的知识止步于会用的程度,对它的底层实现原理一知半解,了解过很多HashMap的知识点,却都是散乱不成体系,今天一灯带你一 ...
- 为啥HashMap的默认容量是16?
集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 在日常开发中,我们经常会像如下方式以下创建一个HashMap: Map& ...
- 为啥HashMap的默认容量是16
集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生. 在日常开发中,我们经常会像如下方式以下创建一个HashMap: Map& ...
- .NET性能优化-你应该为集合类型设置初始大小
前言 计划开一个新的系列,来讲一讲在工作中经常用到的性能优化手段.思路和如何发现性能瓶颈,后续有时间的话应该会整理一系列的博文出来. 今天要谈的一个性能优化的Tips是一个老生常谈的点,但是也是很多人 ...
- Java中HashMap 初始化时容量(参数)如何设置合适?
问题引入 注:本文代码源自java 9. 阿里的插件对于初始化HashMap时,调用无参构造方法,提示如下: 那么问题来了,如果已知需要向 map 中 put n次,那么需要设定初始容量为多少? 单纯 ...
- ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量
当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低. 加载因 ...
- ArrayList、Vector、HashMap、HashTable、HashSet的默认初始容量、加载因子、扩容增量
这里要讨论这些常用的默认初始容量和扩容的原因是: 当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全 ...
- Java中间(三十五)-----Java详细设置(一个):请指定初始容量设置
集合是我们在Java编程中使用很广泛的,它就像大海,海纳百川,像万能容器,盛装万物.并且这个大海,万能容器还能够无限变大(假设条件同意). 当这个海.容器的量变得很大的时候,它的初始容量就会显得很重要 ...
随机推荐
- c# ref和out 详解
前言 数据在内存中,存在两种状态,堆和栈中.堆中的数据是可以直接拿到的,一般称引用对象. 这些对象有一个特征,那就是经过函数处理之后,这些数据在主线程中改变了.好奇点好了,为什么栈中的数据就不会改变呢 ...
- webkit简介
WebKit是一款开源的浏览器引擎,主要用于渲染HTML网页和执行JavaScript代码.WebKit起源于苹果公司,最初是为了开发Safari浏览器而创建的.现在,它已经成为许多浏览器(如苹果的S ...
- 力扣341(java)-扁平化嵌套列表迭代器(中等)
题目: 给你一个嵌套的整数列表 nestedList .每个元素要么是一个整数,要么是一个列表:该列表的元素也可能是整数或者是其他列表.请你实现一个迭代器将其扁平化,使之能够遍历这个列表中的所有整数. ...
- 基于开源PolarDB-X打造中正智能身份认证业务数据基座
简介: 在10月25日由阿里云开发者社区.PolarDB开源社区.infoQ联合举办的「开源人说」第三期--<数据库PolarDB专场>沙龙上,中正智能科技有限公司平台软件部研发总监韩毅带 ...
- 阿里巴巴开源大规模稀疏模型训练/预测引擎DeepRec
简介:经历6年时间,在各团队的努力下,阿里巴巴集团大规模稀疏模型训练/预测引擎DeepRec正式对外开源,助力开发者提升稀疏模型训练性能和效果. 作者 | 烟秋 来源 | 阿里技术公众号 经历6 ...
- Flink 实时计算在微博的应用
简介: 微博通过将 Flink 实时流计算框架跟业务场景相结合,在平台化.服务化方面做了很大的工作,在开发效率.稳定性方面也做了很多优化.我们通过模块化设计和平台化开发,提高开发效率. 微博机器学习研 ...
- [Gin] 单文件极简 HTTP Server 流程分析 ( gin-gonic/gin )
/** * example.go * * @link https://cnblogs.com/farwish */package main import "github.com/gin-go ...
- MSBuild 输出日志可视化工具 MSBuild Structured Log Viewer 简介
感谢 Vatsan Madhavan 小伙伴推荐的 MSBuild 输出日志可视化工具,这个工具可以使用漂亮的 WPF 界面预览 MSBuild 复杂的输出内容 这是一个完全开源的工具,请看 Kiri ...
- k8s问题解决
问题1: 问题描述:k8s中Terminating状态pod不能删除 [root@master ~]# kubectl get pods -n ms NAME READY STATUS RESTART ...
- rails 写入日志函数
json_object={ "ip"=> "127.0.0.1", "ports"=> '80,135', "data ...