好久之前,代码审查的时候,或者看阿里巴巴规约的时候。就提出要给map设置初始值。可是要设置多少。怎么设置 ?
寻找答案
设置多少,口说无凭,你要拿出真正的证据来
于是找啊找,找到了 [程序新视界] juejin.cn/post/696916… 写的这篇文章
下面内容参考作者
如何验证扩容
很多朋友可能也想验证HashMap到底在什么时候进行扩容的,但苦于没有思路或方法。这里提供一个简单的方式,就是基于反射获取并打印一下capacity的值。
还是上面的示例我们改造一下,向HashMap中添加数据时,打印对应的capacity和size这两个属性的值。
public class MapTest {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>(4);
map.put("username", "Tom");
print(map);
map.put("address", "Bei Jing");
print(map);
map.put("age", "28");
print(map);
map.put("phone", "15800000000");
print(map);
}
public static void print(Map<String, String> map) {
try {
Class<?> mapType = map.getClass();
Method capacity = mapType.getDeclaredMethod("capacity");
capacity.setAccessible(true);
System.out.println("capacity : " + capacity.invoke(map) + " size : " + map.size());
} catch (Exception e) {
e.printStackTrace();
}
}
}
复制代码
其中print方法通过反射机制,获取到Map中的capacity和size属性值,然后进行打印。在main方法中,每新增一个数据,就打印一下Map的容量。
打印结果如下:
capacity : 4 size : 1
capacity : 4 size : 2
capacity : 4 size : 3
capacity : 8 size : 4
复制代码
发现什么?当第4个数据put进去之后,HashMap的容量发生了一次扩容。
更多详细内容查看作者文章
其中作者的一句话很有意义:
可能有朋友会问,要不要设置HashMap的初识值,这个值又设置成多少,真的有那么大影响吗?不一定有很大影响,但性能的优化和个人技能的累积,不正是由这一点点的改进和提升而获得的吗?
问题解决
作者并没有给出如果快速解决这个问题
推荐使用谷歌的工具包
//里面放几个预算就写几
Maps.newHashMapWithExpectedSize(2);
具体 分析的这里就不做过多解释
总结
引用 程序新视界 的一句话
- 性能的优化和个人技能的累积,不正是由这一点点的改进和提升而获得的吗?