HashMap负载因子为什么是0.75?
在看一些面试的经典考察题目中,我总结得出了,hasmmap几乎是面试必问的考点,而其中问的方式又是千奇百怪,前前段时间看到了关于hashmap中扩容时的负载因子为什么默认时0.75,后面对其进行了源码上的探索以及相关资料的查询得出了以下原因。
什么是负载因子?
/**
* The load factor used when none specified in constructor.
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;
关于负载因子是与扩容挂钩,阅读源码我们都可以知道,hashmap中的容量为容器容量*负载因子。比如默认的大小为16乘0.75=12,即我们在没有显示的指出容器容量和负载因子大小的,默认的大小为12,而当容器中的存放超过了12时,将会对其进行扩容,当然这里的超过12指的是在hashcode值不同的情况下,一般oracle在设计源码之初,进行设定的默认猜数是经过了多重考虑得出最佳解决方案。以下我们可以对负载因子不同的情况进行探讨。
扩容的源码如下:
final Node<K,V>[] resize() {
Node<K,V>[] oldTab = table;
int oldCap = (oldTab == null) ? 0 : oldTab.length;
int oldThr = threshold;
int newCap, newThr = 0;
if (oldCap > 0) {
if (oldCap >= MAXIMUM_CAPACITY) {
threshold = Integer.MAX_VALUE;
return oldTab;
}
else if ((newCap = oldCap << 1)