HashMap继承和实现
由源码可以看出来HashMap继承AbstractMap抽象类,并实现了Map、Cloneable、Serializable接口,而AbstractMap抽象类实现了Map接口。
结构组成
在JDK7版本中HashMap是由数组+链表组成的,而在JDK8中HashMap是由数组+链表+红黑树实现的,对于原因在后面会讲到,如图所示;
注:图来源于美团点评技术团队
HashMap类的属性
Node[] table数组:通俗讲就是哈希桶,table的大小必须是2的n次方,默认长度时16。
size:实际存在的键值对的数量;
modCount:主要用来记录HashMap内部结构发生变化的次数,主要用于迭代的快速失败。
threshold:键值对阈值,也就是容纳键值对的最大数量;
loadFactor:负载因子,默认值时0.75,建议不要随便修改。
这其中的关系是:threshold = table.length * loadFactor。
存储原理
通过源码可以看到Node[] table数组是个很重要的属性,看源码:
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;//key的哈希值,数据存储的位置
final K key;
V value;
Node