首页 > 其他分享 >HashMap设置初始容量一直都用错了?

HashMap设置初始容量一直都用错了?

时间:2023-05-06 23:11:37浏览次数:34  
标签:Map HashMap 容量 list 0.75 初始

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 总结

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

标签:Map,HashMap,容量,list,0.75,初始
From: https://www.cnblogs.com/Fzeng/p/17378677.html

相关文章

  • 关于Kubernetes-v1.23.6-初始化时报错[WARNING FileExisting-tc]: tc not found in sy
    今天笔者在部署Kubernetes-v1.23.6版本时,在对master节点使用如下命令进行初始化时,报错:[WARNINGFileExisting-tc]:tcnotfoundinsystempath当然其实也从字符意义上来看,只能算是WARNING提醒,不会影响主要的功能和结果,但既然有这个提醒,就可能就在某些地方是有轻微影响的,为了......
  • 简单说说HashMap和LinkedHashMap的区别
    HashMap和LinkedHashMap的区别我们知道HashMap的变量顺序是不可预测的,这意味着便利的输出顺序并不一定和HashMap的插入顺序是一致的。这个特性通常会对我们的工作造成一定的困扰。为了实现这个功能,我们可以使用LinkedHashMap。LinkedHashMap详解先看下LinkedHashMap的定义:pu......
  • Hashtable、synchronizedMap、ConcurrentHashMap 深度比较
    关键字:Hashtable、synchronizedMap、ConcurrentHashMap深度比较util.concurrent包除了包含许多其他有用的并发构造块之外,还包含了一些主要集合类型List和Map的高性能的、线程安全的实现。BrianGoetz向您展示了用ConcurrentHashMap替换Hashtable或synchro......
  • rock和yubuntu安装后需要做的初始化操作
    Rock和Ubuntu安装后需要做的初始化操作一.CentOS安装后必需所做的初始化操作#关闭SELinuxsed-i'/^SELINUX=/cSELINUX=disabled'/etc/selinux/config#关闭防火墙systemctldisable--nowfirewalld#支持光盘,/misc/cd对应就是光盘内容yum-yinstallautofssystemctlenable......
  • numpy.empty—返回给定形状和类型的未初始化新数组
    语法格式numpy.empty(shape, dtype=float, order='C', *, like=None)参数解释:shape:空数组的形状dtype:数据类型order:在内存中以行("C")或列("F")顺序存储多维数据,默认为"C"返回未初始化(任意)数据给定形状,dtype,和顺序的数组注意:与numpy.zero不同,numpy.empty不会......
  • spring boot 初始化先后顺序
    初始化方法@PostConstructInitializingBeanCommandLineRunnerApplicationRunner先后顺序@PostConstruct>InitializingBean>CommandLineRunner、ApplicationRunner项目启动执行一次CommandLineRunner、ApplicationRunner通过@Order控制先后顺序,越小越先执行......
  • centos os初始设置
    echo"192.168.14.141mysql1">>/etc/hostsecho"exportLANG=en_US">>~/.bash_profile资源限制参数cat>>/etc/security/limits.conf<<EOF*softnproc65535*hardnproc65535*softnofile65535*softnofile655......
  • 部署Kubernetes遇到的问题与解决方法(初始化等)
    Kubelet和controlplane版本不对应:[ERRORKubeletVersion]:thekubeletversionishigherthanthecontrolplaneversion.Thisisnotasupportedversionskewandmayleadtoamalfunctionalcluster.Kubeletversion:"1.19.4"Controlplaneversion:&qu......
  • gitlab的主分支由master改为main后,怎么初始化项目
    1.如果从来没有在当前电脑添加git账户,则gitconfig--globaluser.name'用户名'gitconfig--globaluser.email'邮箱'2.初始化gitinit3.与远程仓库建立联系gitremoteaddorigin你的代码地址4.先拉一下代码gitpull--rebase originmain5.修改分支名称(如果先修改,......
  • java基础-数组的定义,静动态初始化,数组元素的相关操作、数组的内存图
    一、什么是数组数组指的是一种容器,可以用来存储同种数据类型的多个值。数组容器在存储数据的时候,需要结合隐式转换考虑。例如:int类型的数组容器,只能存储byte、short、int类型的数据。(byte<short<int<long<float<double)例如:double类型的数组容器,可以存储byte、short、int、long......