HashMap
HashMap是什么
HashMap是Java常用的用来储存键值对的数据结构,它是线程不安全的,可以储存null键值
结构图如下:
从结构图可以看出:
1、HashMap继承于AbstractMap,实现Map,Serializable,Cloneable接口
2、实现了Cloneable,能被克隆
3、实现了Serializable,支持序列化
4、继承AbstractMap,说明元素以K-V(键值对)形式存储
HashMap源码分析(JDK1.8)
数据结构
JDK1.8之前 HashMap底层由数组+单链表实现
JDK1.8之后,当链表长度大于8时,链表转成红黑树形式存储数据
数据结构图如下:
实现代码:
static class Node<K,V> implements Map.Entry<K,V> {
final int hash; // 用来定位数组索引位置
final K key;
V value;
Node<K,V> next; // 下一个元素
}
可以看出,Node就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。
构造函数
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
public HashMap(Map<? extends K, ? extends V> m) {
this.loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}
从构造函数中我们可以得到几个关键参数,initialCapacity(初始容量),loadFactor(负载因子)
int size; // 元素个数
int modCount; // 操作计数
int threshold; // 所能容纳的key-value对极限
final float loadFactor;// 负载因子
Node[] table的初始化长度length(默认值是16)&#