摘自 jdk 1.8 HashMap

/**
• The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

默认初始化长度为16。 1 << 4 效率没有16高,只是为了强调是2的n次幂。

HashMap的加载因子,默认是0.75

1. /**
2.      * The load factor used when none specified in constructor.
3.      */
4. static final float DEFAULT_LOAD_FACTOR = 0.75f;

当HashMap中元素数超过容量*加载因子时,HashMap会进行扩容。
image.png

HashMap的数据结构,数组+链表。

扩容

resize()方法。
触发时机:put元素之后。
超过初始大小*加载因子的时候会出发扩容,新建一个table[]数组,是原来长度的2倍。
如果达到了最大值,不扩容。
jdk 1.7 和之前 头插法 ,线程不安全,扩容和put同时进行,链表有几率成环,扩容死循环。
jdk 1.8 后 尾插法 ,put 和 get 线程同样不安全,currentHashMap 线程安全。
jdk1.8后链表长度大于8 会考虑是否转成红黑树。如果table长度不满64,会优先触发resize(),重新散列。如果大于8,并且hashMap大于64,会触发链表转为红黑树。
小于6 在resize的时候会触发红黑树转链表。


Empty
1 声望0 粉丝