HashMap的负载因子初始值为什么是0.75?

1. 负载因子的作用

	简单来说,hashMap的初始默认容量值为16,当初始容量值达到16*0.75=12的时候,会自动触发扩容机制。

2. 源码介绍

public class HashMap<K,V> extends AbstractMap<K,V> 
									implements Map<K,V>, Cloneable, Serializable {
	//默认负载因子为0.75
    static final float DEFAULT_LOAD_FACTOR = 0.75f;
    
     /**
     * Constructs an empty <tt>HashMap</tt> with the specified initial
     * capacity and load factor.
     *
     * @param  initialCapacity the initial capacity  
     * @param  loadFactor      the load factor
     * @throws IllegalArgumentException if the initial capacity is negative
     *         or the load factor is nonpositive
     */
    public HashMap(int initialCapacity, float loadFactor) {
    	//初始容量小于0抛异常
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        //负载因子小于0抛异常
        if (loadFactor <= 0 || Float.isNaN(loadFactor))
            throw new IllegalArgumentException("Illegal load factor: " +
                                               loadFactor);
        this.loadFactor = loadFactor;
        this.threshold = tableSizeFor(initialCapacity);
    }

3. 原因解释

官方解释:
这里是引用

通俗来讲,当负载因子为1.0时,意味着只有当hashMap装满之后才会进行扩容,虽然空间利用率有大的提升,但是这就会导致大量的hash冲突,使得查询效率变低。

当负载因子为0.5或者更低的时候,hash冲突降低,查询效率提高,但是由于负载因子太低,导致原来只需要1M的空间存储信息,现在用了2M的空间。最终结果就是空间利用率太低。

总结

负载因子是0.75的时候,这是时间和空间的权衡,空间利用率比较高,而且避免了相当多的Hash冲突,使得底层的链表或者是红黑树的高度也比较低,提升了空间效率。


版权声明:本文为weixin_49448233原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。