HashMap源码分析
按住 ctrl点击 HashMap进入源码
//这个是 初始化的长度 为 1<<4 结果为:16 << 位运算符
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
//这个是最大的容量 2的30次方
static final int MAXIMUM_CAPACITY = 1 << 30;
//这个是map集合的容量为100 如果过75%了 就需要扩容了
static final float DEFAULT_LOAD_FACTOR = 0.75f;
//这个意思是 如果数组的长度大于64 且链表超过8 就会产生红黑树
static final int TREEIFY_THRESHOLD = 8;
//这个意思是 当链表长度小于6 调整成链表
static final int UNTREEIFY_THRESHOLD = 6;
//这个意思是 当链表长度大于8的时候,并且集合元素个数大于64 产生红黑树
static final int MIN_TREEIFY_CAPACITY = 64;
// 哈希表中的数组
transient Node<K,V>[] table;
//元素个数
transient int size;
按住 ctrl点击 new 的HashMap进入源码
这个是根据给定的元素 如果大于75 集合进行扩容
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
刚创建hashmap之后没有添加元素 table=null size=0;
总结:
1. HashMap刚创建时,table=null 为了节省空间,当添加第一个元素时,table容量调整为16
2.当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍。目的是减少调整元素的个数。
3.jdk1.8 当每个链表长度大于8,并且元素个数大于64时,会调整为红黑树,目的时调高执行效率。
4.Jdk1.8 当链表长度为6时,调整成链表
5.jdk1.8以前,链表时头插入,jdk1.8以后是尾插入。