目录
一、为什么要指定容量
其实核心点,就是避免数据量慢慢增加,导致反复触发扩容,影响性能。
二、使用方式
1.确定阈值
阈值的计算方式:(需要存储的元素个数/负载因子)+1
负载因子默认为0.75
如果要存放4个元素,4/0.75+1=6.33,指定6和7都可以,因为HashMap会转换成大于该capacity的第一个2的幂作为容量
所以传5,6,7,8 都是 8 ;
传9,10,11,12,13,14,15,16 都是 16 ;
2.示例
@Test
public void mapTest() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//可以存放的元素个数为4*0.75=3
//阈值的设定:(需要存储的元素个数/负载因子)+1
Map<String,String> map = new HashMap<>(4);
Class<? extends Map> mapClass = map.getClass();
Method capacity = mapClass.getDeclaredMethod("capacity");
capacity.setAccessible(true);
map.put("1","第一个元素插入");
System.out.println("capacity:" + capacity.invoke(map) + " size:" + map.size());
map.put("2","第二个元素插入");
System.out.println("capacity:" + capacity.invoke(map) + " size:" + map.size());
map.put("3","第三个元素插入");
System.out.println("capacity:" + capacity.invoke(map) + " size:" + map.size());
map.put("4","第四个元素插入");
System.out.println("capacity:" + capacity.invoke(map) + " size:" + map.size());
map.put("5","第五个元素插入");
System.out.println("capacity:" + capacity.invoke(map) + " size:" + map.size());
}
总结
最后再补一嘴, 默认指定容量,其实就是 内存换性能。
如果可以确认map存放的元素较少,小于默认指定的16(即12个元素)时,可以指定一下,减少内存 。
list集合初始化时,如果能够确认集合的大小,可以在初始化时设定集合的大小。