看源码之前,先来说一下HashMap的基本管理,这个类比较复杂。
HashMap的底层是个数组,数组的每个元素称为桶(bin),桶里存着的是链表或红黑树,最初默认是存链表,如果链表长度超过一定值,就会转换成红黑树,这就是HashMap的存储原理。
列出几个关键数值
1.哈希桶初始容量为16
2.一个HashMap容纳的最多键值对数目为2的30次方
3.每个哈希桶对应的链表长度超过8个 该链表会转换成树
4.如果一个哈希桶元素对应的是树 这棵树节点数目小于6 这棵树会转换成链表
5.任意一个桶的链表想要转换成树 整个哈希桶数组的长度不能小于64 如果一个桶的链表要转换成树 但整个哈希桶数组的长度没有达到64 先将哈希桶数组扩容至64个元素容量
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
这个类继承自AbstractMap,实现了Map接口,Cloneable接口和Serializable接口。
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
这个成员变量是初始数组长度,也就是16。
static final int MAXIMUM_CAPACITY = 1 << 30;
这个成员变量是最大数组长度,也就是2的30次方。
static final float DEFAULT_LOAD_FACTOR = 0.75f;
这个是载荷,以后会解释,默认0.75。
static final int TREEIFY_THRESHOLD = 8;
这个是将桶中的链表转换为红黑树的条件,也就是链表的长度大于8,就会被转换成红黑树。
static final int UNTREEIFY_THRESHOLD = 6;
这个就是将红黑树还原成链表的条件,也就是红黑树元素数为6以下时,就会被转换成链表。
static final int MIN_TREEIFY_CAPACITY = 64;
这个是将底层数组转换成红黑树的条件,如果数组元素多于64,那么底层数组将转换成红黑树。