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

来源:51CTO  责任编辑:小易  

PO(persistant object) 持久对象在 o/r 映射的时候出现的概念,如果没有

【金融特辑】光大银行科技部DBA女神带你从0到1揭秘MGR-->

集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生。

“阿里巴巴编码规范”是阿里云大学基于《阿里巴巴Java开发手册》打造的认证,用于考察以及让开发者自查

关于HashMap,很多人都对他有一些基本的了解,比如他和hashtable之间的区别、他和concurrentHashMap之间的区别等。这些都是比较常见的,关于HashMap的一些知识点和面试题,想来大家一定了熟于心了,并且在开发中也能有效的应用上。

提问者你好,我可以给你点意见 不满您说,我是刚从阿里巴巴辞职的,干过1年销售,至于你信不信,反正我是

但是,作者在很多次 CodeReview 以及面试中发现,有一个比较关键的小细节经常被忽视,那就是HashMap创建的时候,要不要指定容量?如果要指定的话,多少是合适的?为什么?

是一些在开发时的规范,比如方法的命名,比如方法参数的个数的限制等等,不再一一列举,了解开发规范,有助

要设置HashMap的初始化容量

如果是idea的化,你安装好插件之后,上面有两个按钮,你点那个绿色的,就会弹出下面的弹层,弹层里,会

在《HashMap中傻傻分不清楚的那些概念》中我们曾经有过以下结论:

2008年北京奥运会举办的相当成功,这次体育盛会让世界更多国家了解到中国,很多运动员称来中国参加奥运会是他们终身难忘的奥运之旅,中国俨然成为了体育大国。北京奥运会空前成功2022年在北京-张家口举办的第24届冬季奥林匹克运动会将再次展现中国魅力。届时,相信很多运动员会再体验一次终身难忘的冰雪运动会。只有一个中国然而世界上只有一个中国,不是所有的国家都有我们这样的财力和魄力!如今奥运会就遇上了一个难题:没有国家申办!法国:我们只想玩玩!2024年奥运会的举办城市,先后有多个国家退出了申办,比如匈牙利的布达佩斯、德国的汉堡、意大利的罗马和加拿大的多伦多等城市。\\每次和孩子他妈办羞羞事都撑不很久\

HashMap有扩容机制,就是当达到扩容条件时会进行扩容。HashMap的扩容条件就是当HashMap中的元素个数(size)超过临界值(threshold)时就会自动扩容。在HashMap中,threshold = loadFactor * capacity。

感谢邀请。卫生间三分离需要至少6.2平方米的面积,以及要功能配合。如果你有这么大卫生间的条件,当然三分离是更舒适的。但是,因为你家只有一个卫生间,如果又有三个以上的家人,建议不要追求三分离,而要考虑怎么增加一个马桶(即双马桶)。因为早上最要命的其实是排队上厕所……最后解答关于镜子如何不对着主卧门的方法。红色部分为卫生间台面,蓝色为镜子/镜面摆放的地方。(反向的话就有点正对次卧的门了,相信题主也不喜欢···)所以题主可以如图一样选用一个“L”型台面,长的那一侧可以做得稍窄一些,然后把短的这一侧加宽,作为洗面盆放置的地方。窄台面那部分放置瓶瓶罐罐,当然更好的是你在这一侧做个悬挂式的置物架或收纳柜,

所以,如果我们没有设置初始容量大小,随着元素的不断增加,HashMap会发生多次扩容,而HashMap中的扩容机制决定了每次扩容都需要重建hash表,是非常影响性能的。

这种电机是有刷直流电机,启动电机转动没劲,会造成启动电流会比较大,所谓明显会温度升高,这是最直接的,请关注容济点火器1、按启动按钮时候可以听到电机转速低,或者被带动的发动机转速低。2、另外在电起动时可能会有响声,那种金属摩擦的声音,是齿轮撞击。3、电流大了会有嗡嗡声音4、当然最差的表现是马达嗡嗡响,根本启动不了。启动马达在启动时无力的原因很多,大都是启动电机老旧造成的,一般出现的毛病有:1、碳刷磨损严重,2、转子与碳刷结合部磨损严重,3、启动机转子轴套磨损严重,造成转子轴旋转时轴向跳动,4、启动机轴头齿磨损,造成与超越离合器齿盘咬合不好,这些都是因为电机使用时间过长造成的。如果你的是新车的话,

所以,首先可以明确的是,我们建议开发者在创建HashMap的时候指定初始化容量。并且《阿里巴巴开发手册》中也是这么建议的:

睡觉流口水莫大意,或是疾病的前兆!有些人睡觉的时候爱打呼噜,有些人爱说梦话,还有些人爱磨牙,这些睡觉时的怪癖对我们来说都不会陌生,外加上一个让许多人都中枪的情况——爱流口水,这四种行为简直就是睡觉时的“四大魔怔”有木有?!睡觉爱流口水这个情况,不分男女老少,一般如果是儿童或者小宝宝睡觉流口水,我们就会觉得很正常。但是,对于已经成年的我们来说,为什么长这么大睡觉还会流口水,是正常的么?医学上把这种情况叫做「流涎症」。通常睡觉的时候,我们产生的口水明显比清醒时少;但是在清醒时我们能主动把产生的口水咽下,所以并不会发生口水从嘴角流出来的状况。正常情况下,睡眠时我们也会把口水咽下,但由于各种原因影响了

HashMap初始化容量设置多少合适

那么,既然建议我们集合初始化的时候,要指定初始值大小,那么我们创建HashMap的时候,到底指定多少合适呢?

有些人会自然想到,我准备塞多少个元素我就设置成多少呗。比如我准备塞7个元素,那就new HashMap(7)。

但是,这么做不仅不对,而且以上方式创建出来的Map的容量也不是7。

因为,当我们使用HashMap(int initialCapacity)来初始化容量的时候,HashMap并不会使用我们传进来的initialCapacity直接作为初始容量。

JDK会默认帮我们计算一个相对合理的值当做初始容量。所谓合理值,其实是找到第一个比用户传入的值大的2的幂。

也就是说,当我们new HashMap(7)创建HashMap的时候,JDK会通过计算,帮我们创建一个容量为8的Map;当我们new HashMap(9)创建HashMap的时候,JDK会通过计算,帮我们创建一个容量为16的Map。

但是,这个值看似合理,实际上并不尽然。因为HashMap在根据用户传入的capacity计算得到的默认容量,并没有考虑到loadFactor这个因素,只是简单机械的计算出第一个大约这个数字的2的幂。

loadFactor是负载因子,当HashMap中的元素个数(size)超过 threshold = loadFactor * capacity时,就会进行扩容。

也就是说,如果我们设置的默认值是7,经过JDK处理之后,HashMap的容量会被设置成8,但是,这个HashMap在元素个数达到 8*0.75 = 6的时候就会进行一次扩容,这明显是我们不希望见到的。

那么,到底设置成什么值比较合理呢?

这里我们可以参考JDK8中putAll方法中的实现的,这个实现在guava(21.0版本)也被采用。

这个值的计算方法就是:

return (int) ((float) expectedSize / 0.75F + 1.0F);

比如我们计划向HashMap中放入7个元素的时候,我们通过expectedSize / 0.75F + 1.0F计算,7/0.75 + 1 = 10 ,10经过JDK处理之后,会被设置成16,这就大大的减少了扩容的几率。

当HashMap内部维护的哈希表的容量达到75%时(默认情况下),会触发rehash,而rehash的过程是比较耗费时间的。所以初始化容量要设置成expectedSize/0.75 + 1的话,可以有效的减少冲突也可以减小误差。(大家结合这个公式,好好理解下这句话)

所以,我们可以认为,当我们明确知道HashMap中元素的个数的时候,把默认容量设置成expectedSize / 0.75F + 1.0F 是一个在性能上相对好的选择,但是,同时也会牺牲些内存。

这个算法在guava中有实现,开发的时候,可以直接通过Maps类创建一个HashMap:

Map

其代码实现如下:

    public static <K, V> HashMap<K, V> newHashMapWithExpectedSize(int expectedSize) {      return new HashMap(capacity(expectedSize));   static int capacity(int expectedSize) {      if (expectedSize < 3) {          CollectPreconditions.checkNonnegative(expectedSize, "expectedSize");          return expectedSize + 1;      } else {          return expectedSize < 1073741824 ? (int)((float)expectedSize / 0.75F + 1.0F) : 2147483647;      }  

但是,以上的操作是一种用内存换性能的做法,真正使用的时候,要考虑到内存的影响。但是,大多数情况下,我们还是认为内存是一种比较富裕的资源。

但是话又说回来了,有些时候,我们到底要不要设置HashMap的初识值,这个值又设置成多少,真的有那么大影响吗?其实也不见得!

可是,大的性能优化,不就是一个一个的优化细节堆叠出来的吗?

再不济,以后你写代码的时候,使用Maps.newHashMapWithExpectedSize(7);的写法,也可以让同事和老板眼前一亮。

或者哪一天你碰到一个面试官问你一些细节的时候,你也能有个印象,或者某一天你也可以拿这个出去面试问其他人~!啊哈哈哈。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

阿里巴巴资深java工程师什么水平

大家都知道,阿里P8高级技术专家,基本上是一线技术人能达到的最高职级,也是很多程序员追求的目标。

达到年入百万的P8 Java高级架构师级别,不仅要具备优秀的编程能力和系统设计能力,在技术视野和业务洞察力方面,也要有很深的积淀。

经过我半年多的整理,今天刚好有此机会,我整理了一份架构图谱,主要是针对2-5年左右的Java开发程序员提升的,不管是传统行业还是互联网行业,掌握这些技术基本都能拿到一个不错的薪资,希望对大家有所帮助。

阿里是Java大厂,所以可以参考阿里的标准,而对P8的要求是什么呢?

1、代码能力

代码能力是基本功,Java语言本身,包括语言的各个方面包括对并发的理解,对内存使用对理解,对Java运维的理解等等,语言本身外,社区里常用的框架是否可以十分清晰的了解,包括spring,包括他实现的ioc,aop,orm,web机制是否有清楚的认识,有丰富的经验等等。

2、对常用中间件的理解

毕竟在一个大系统中,各种中间件是是否常见的,缓存中间件,消息中间件,例如 redis、memcache、rmq这些,要理解常用中间件使用场景,使用姿势(例如redis的常用命令),甚至包括他的一些运维,一旦出了问题,除了专门的运维人员,也需要你参与问题的排查,因为有时候这些中间件出现问题,是不当的使用姿势引起的。

3、架构、业务落地能力

前面提到了语言本身,各种中间件,如果你有很好的业务抽象能力和架构思维,就可以把一款部门内部产品很好的设计并实施了,这点蛮难的,想必都有过接手现有项目的经历吧,有时候真恨不得把之前的设计者拿出来批斗,作为一个设计者,你能否做到当下一个接手它的人会说一句,这个系统设计的真好,稳定又可拓展,理解起来也很容易。

4、沟通协作

毕竟一个部门内部产品,是不可能由一个人完成的,所以需要沟通协作,把设计好的方案,要和2-3个小伙伴一起实施,包括同样身份的后端人员,前端人员,产品等角色,这个级别的人可能会参与带2-3个人,例如应届毕业等,所以你自己对知识的把握,分享精神,leadership都是很好的加分项。

针对技术这一块,我自己除了整理了一份架构图谱,还找朋友录了一些视频,和自己收集了一些视频,讲解的都是一线大牛,里面包括了一些Java分布式、微服务架构、源码分析、性能优化、并发编程等技术视频,这段时间面试跳槽的朋友比较多,还有一套BAT面试题合集,我都分享在网盘里了,欢迎前来下载。

第一阶段

第一阶段主要从 svn/git 版本控制、Java高并发、JVM虚拟机、RPC架构实战、Redis、Hadoop、高并发分布式项目实战、Nginx、Tomcat负载均衡和调优的角度来学习。

第二阶段

第二阶段主要从架构设计、分布式、Niginx负载均衡、ActiveMQ集群、高可用MySQL、Storm流、Mycat分布式架构、分布式系统案例实战等方面来学习。

第三阶段

第三阶段主要注重架构实践:从高并发高级群分布式、高可用可扩展、Java高并发系统架构实例、高并发数据库设计、MySQL主从复制和高可用集群、海量数据库架构设计等方面学习。

第四阶段

第四阶段主要从互联网高并发解决方案、Java高级架构师、大数据、大数据底层算法、分布式数据库架构详解、等方面来学习。

Java电子书

原文:阿里P8 Java高级工程师,都需要掌握哪些技术?

阿里巴巴 用什么java框架

1、现在的大公司都是有很多积累的,他们都拥有适合自己的框架技术,这些全靠积累。所以阿里巴巴的主流Java框架是自己写的,同时结合了大量open source的资源。2、WEB层 —— 使用webx框架。主要利用velocity模板技术来展现页面。3、业务层 —— 主要使用command模式实现。WEB层通过command dispatcher的调用来使用业务逻辑。4、数据访问层 —— 使用DAO(Data Access Object)模式。底层使用iBatis来访问数据库。数据采用的是Oracle。数据库操作的SQL语句需要你手工书写相关的SQL代码(对于复杂的SQL语句需要通过DBA的评审)。5、开发工具,采用IDE和命令行相结合的模式。在命令行上,我们用antx工具来组织项目、build项目、发布项目。但我们多数时间会在eclipse集成环境上,开发、调试应用。6、版本控制,采用了Subversion。但部分项目因为历史的原因,暂时使用CVS,将来必然会迁移到Subversion上。Subversion有很多种操作方式:通过命令行、通过TortoiseSVN集成工具、通过WEB、通过Eclipse插件。总结:在所有层次上,他们都广泛使用了Spring framework。因此您需要对Spring有一定的了解才行。阿里面试时非常考验基础知识的,因为他们有自己的技术积累,框架技术已经趋于成熟,所以面试都是一些基础知识与算法知识。现在的阿里技术或许已经更加成熟,

阿里巴巴java程序员p7级别需要哪些技能和条件,怎么才能成功进入阿里p7级别

整体上来说从P1开始到P14都有人的。

P1,P2不太了解。其他的职称是这么评价的,你的title+工种。比如P7产品经理=产品专家

一般到P3为助理

P4=专员

P5=资深专员

P6=高级专员(也可能是高级资深)

P7=专家

P8=资深专家(架构师)

P9=高级专家(资深架构师)

P10=研究员

P11=高级研究员

P12=科学家

P13=首席科学家

P14=马云

以上是网上复制过来的

买了《阿里巴巴JAVA开发手册》的人,后悔了吗

这个还用买?

人家那都是开源的,公众号之类的上面都定期更新的,完全都是公开的,你换用买啊。。。

  • 本文相关:
  • 【金融特辑】光大银行科技部DBA女神带你从0到1揭秘MGR
  • 为什么给Java代码加个空行,class文件就翻脸不认人了?
  • IT行业薪水:系统和数据架构师、云工程师薪资最高;增长最快技术K8s
  • 2020年3月编程语言排行榜:Go飞速大涨;Delphi走向没落
  • 浓缩精华的架构演进过程,我连看了六遍!
  • 中国博士开发可交互全球疫情地图,登上柳叶刀,GitHub已有4500星
  • 预见2020,网络安全趋势展望
  • 金蝶云全球用户大会
  • 第九届中国云计算标准和应用大会
  • 等保2.0实施在即,企业如何提升全网安全能力?
  • 阿里巴巴资深java工程师什么水平
  • 阿里巴巴 用什么java框架
  • 阿里巴巴java程序员p7级别需要哪些技能和条件,怎么才能成功进入阿里p7级别
  • 买了《阿里巴巴JAVA开发手册》的人,后悔了吗
  • 阿里巴巴是JAVA开发的吗
  • 如何理解《阿里巴巴Java开发手册》中提到的 DO/DTO/BO/VO/QUERY
  • 如何评价阿里巴巴java编码规范认证考试
  • 阿里巴巴java安卓工程师月薪刚出去的时候月薪大概多少呢?
  • 《阿里巴巴Java开发规约》到底是什么东东
  • 阿里巴巴java开发规约怎么用
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved