HashMap原理
HashMap采用Entry数组来存储Key-Value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向链表结构,它具有Next指针,可以连接下一个Entry实体。只是在JDK1.8中,链表长度大于8的时候,链表会转为红黑树!
1)先来认识一下HashMap中定义的一些需要了解的成员变量
//hashMap数组的初始容量是16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
//负载因子0.75f
static final float DEFAULT_LOAD_FACTOR = 0.75f;
//树形化阈值8
static final int TREEIFY_THRESHOLD = 8;
//解除树形化阈值6
static final int UNTREEIFY_THRESHOLD = 6;
//树形化的另一条件:Map数组的长度阈值64
static final int MIN_TREEIFY_CAPACITY = 64
//这个就是hashMap的内部数组了,而Node则是链表节点对象。
transient Node<K,V>[] table;
//数组扩容阈值
int threshold;
initialCapacity数组的初始化容量为16。可以在构造方法中指定,必须是2的幂次方(16—>32—>64…)
loadFactor加载因子0.75f。所谓加载因子就是HashMap的容量达到0.75时的时候会试试扩容resize();
例如:
假设有一个HashMap的初始容量为16,那么扩容的阈值就是0.75*16=12,也就是说,在你打算存入第13个值的时候,HashMap就会先执行扩容。加载因子也是能通过构造方法中指定,如果指定大于1,则数组不会扩容,牺牲了性能不过提升了内存。
TREEIFY_THRESHOLD 树形化阈值。当链表的节点个数大于等于这个值时,会将链表转化
为红黑树。
UNTREEIFY_THRESHOLD 解除树形化阈值。当链表的节点个数小于等于这个值时,会将
红黑树转换成普通的链表。
MIN_TREEIFY_CAPACITY树形化阈值的第二条件。当数组的长度小于这个值时,就算树形
化阈达标,链表也不会转化为红黑树,而是优先扩容数组resize()。
threshold 数组扩容阈值。即:HashMap数组总容量 * 加载因子。当前容量大于或等于该
值时会执行扩容resize()。扩容的容量为当前 HashMap 总容量的两倍。比如,当前
HashMap 的总容量为 16 ,那么扩容之后为 32 。
2)继承关系
//table内部数组是节点类型
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<