> 學習源碼之前,最好在腦海中明確 HashMap 的存儲結構,不然后面閱讀源碼,遇到容量、數量等參數可能會有些許困惑。
相信你已經有所耳聞,HashMap 內部包含了一個 Node 類型的數組 table。Node 存儲著鍵值對。
Node 類源碼如下:
```java
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() {
return Objects.hashCode(key) ^ Objects.hashCode(value);
}
public final V setValue(V newValue) {
V oldValue = value;
value = newValue;
return oldValue;
}
public final boolean equals(Object o) {
if (o == this) {
return true;
}
if (o instanceof Map.Entry) {
Map.Entry<?, ?> e = (Map.Entry<?, ?>) o;
if (Objects.equals(key, e.getKey()) &&
Objects.equals(value, e.getValue())) {
return true;
}
}
return false;
}
}
```
它包含了四個字段,從 next 字段我們可以看出 Node 是一個鏈表。即數組中的每個位置被當成一個桶,一個桶存放一個鏈表。HashMap 使用鏈地址法來解決哈希沖突,即同一個鏈表中存放**哈希值和散列桶取模運算結果相同**的 Node。HashMap 存儲結構如下圖所示:
