看过HashMap源码的人(大神请忽略)可能会有些疑问,HashMap究竟什么时候扩容?扩容的条件是什么?好的,接下啦我给大家介绍一下HashMap扩容相关的一些参数。
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//默认的桶数组大小
static final int MAXIMUM_CAPACITY = 1 << 30;//极限值(超过这个值就将threshold修改为Integer.MAX_VALUE(此时桶大小已经是2的31次方了),表明不进行扩容了)
static final float DEFAULT_LOAD_FACTOR = 0.75f;//负载因子(请阅读下面体会这个值的用处)
容量(capacity):HashMap中数组的长度
加载因子(Load factor):HashMap在其容量自动增加前可达到多满的一种尺度,默认加载因子 = 0.75
扩容阈值(threshold):当哈希表的大小 ≥ 扩容阈值时,就会扩容哈希表
下面再用通俗一点的话说明一下
我们都知道HashMap的初始值是16(1,<<4),负载因子0.75(听说这个值是经过大量实践算出来的,这个值设定最合理),初始值16指的是数组的长度(1<<4是2的4次方,这样写计算机执行更快),当数组的容量达到12(16*0.75)时,这时开始扩容,扩容为32(1<<5即2的5次方),每次扩容按照2的倍数递增,扩容是为了减少hash碰撞,让链表的数据更少(最好链表上就一个数据,即为数组的下标数据)
网友评论