最详细HashMap集合源码讲解(putVal()方法)
1. HashMap的结构
讲解代码前,先熟悉几个常量的意义
- DEFAULT_INITIAL_CAPACITY :默认HashMap初始化桶(数组)大小,一般为1>>4即16
- loadFactor:负载因子,一般初始化为0.75
- threshold :是指HashMap存储数据的数据个数大于thrashlod时要进行扩容,threshold=HashMap桶的大小*负载因子
- Node<K,V>[] table:table是HasHMap存储数据的桶(数组)
1.1 HashMap实现了Map<K,V>接口,而Entry<K,V>是Map接口中的一个接口,在HashMap的Node<K,V>静态内部类中实现了Entry接口
interface Entry<K,V> {
K getKey();
V getValue();
V setValue(V value);
boolean equals(Object o);
int hashCode();
}
1.2 Node类是HashMap中存储数据的节点,其结构具有四个属性即:
- hash:(Key的Hash值)
- Key:键值对的键
- value:键值对中的键值
- Node<K,V> next:下一个节点的值
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
Node(int hash, K key, V value, Node<K,V> next) {
this.hash = hash;
this.key = key;
this.value = value;
this.next = next;
}
public final K getKey() {
return key; }
public final V getValue() {
return value; }
public final String toString() {
return key + "=" + value; }
public final int hashCode() {