看过的HashMap的源码都知道 在我们声明容器的时候指定一个初始容量是一种比较合适的做法。
你设置的初始容量真的就是指定了容器的大小吗?
请看以下代码
public static void main(String[] args) {
//设置一个初始化容量为10的map
Map map = new HashMap<>(10);
//放入1个元素
map.put("1","2");
//调用方法输出
print(map);
}
public static void print(Map 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();
}
}
请看结果:
capacity : 16 size : 1
是因为设置初始化值得时候并不是按照指定的数值进行创建map 而是通过位运算后得到一个与我们设定值相近且大于的2的次方的值 大致上为 16,32,64,128,256等等
扩容机制真的是按照0.75来进行的?
请看以下代码
public static void main(String[] args) {
Map map = new HashMap<>(10);
for (int i = 0; i < 100; i++) {
map.put("1"+i,"2");
print(map);
}
}
请看结果:输出太多 只贴出关键部分
capacity : 16 size : 10 capacity : 16 size : 11 capacity : 16 size : 12 capacity : 16 size : 13 capacity : 16 size : 14 //应该在12的时候进行扩容 capacity : 32 size : 15 capacity : 32 size : 16 capacity : 32 size : 17
为什么在插入第15个时候才进行扩容呢?
因此不仅仅和扩容因子有关,也和内存有关。如果key和value如果特别大那么就可能会引起提前扩容。



