今天在对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 原理。