map初始化的两种方法

今天在对map进行初始化时,查询到一种新的初始化的方法因此做次记录。
第一种:
平常常用的一种先new一个map,再调用map对象的put方法依次添加映射关系

Map<String,Integer> skuLimitRate = new HashMap<String,Integer>();
skuLimitRate,put("String1",1);
skuLimitRate.put("String2",2);

第二种
使用双花括号的形式,这种形式感觉有一定程度上是类似于lambo表达式,但是又不一样

Map<String,Integer> skuLimitRate = new HashMap<String,Integer>(){
{
put("String1",1);
put("String2",2);
}
}

从网上查看到有大佬对这两种put优劣的一种分析:

优势 学名叫双花括号。双花括号是节省效率的,MAP 自增机制对效率的影响尤为重要,以 HashMap 为例,初始默认空间为 16,每次自增为其两倍,就是 16、32、64、128、256...,当所用空间较少时,MAP 需频繁的自我复制来进行自增。当使用双花括号,取 MAP 某个较大的自增临界点进行测试时,会发现在自增前使用 put 方法,效率比在双花括号外 put 快 1/3 左走,但当空间增加到触发自增时,由双花括号内触发的自增效率,比双花括号内触发的自增要慢很多很多。当所用空间较少,MAP 频繁自增,由双花括号内触发的自增,损耗性能较大,当所用空间越来越多,双花括号内使用 put 方法,节省性能越多。若使用双花括号当自增达到某一临界值时,put 所节省的性能便会远远大于自增所消耗的性能,当然这个临界值会很大(本人曾经测到过 put 到九千万,性能波动情况类似于一个在 X 轴上下波动,整体 Y 值趋势于负增长的二次元函数),所以当所占空间较少时,使用带有自我复制进行自增的集合来测试双花括号是不准确的。您若用真实实体对象就轻松多了,实体对象在 JDK12 下使用双花括号设置属性,会提升 1/3 的效率。详细原因可以查看 JVM 原理。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容