深入剖析HashMap源码

7次阅读

共计 1262 个字符,预计需要花费 4 分钟才能阅读完成。

HashMap 特点

  • HashMap 底层采用的是数组 + 链表 + 红黑树(JDK1.8)
  • HashMap 是采用 key-value 形式存储,其中 key 是可以允许为 null 但是只能是一个,并且 key 不允许重复。
  • HashMap 是线程不安全的。
  • HashMap 存入的顺序和遍历的顺序有可能是不一致的。
  • HashMap 保存数据的时候通过计算 key 的 hash 值来去决定存储的位置

属性

public class HashMap<K,V> extends AbstractMap<K,V>
              implements Map<K,V>, Cloneable, Serializable {
// 默认初始容量为 16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; 
// 最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;
// 默认负载因子为 0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;
//Hash 数组 (在 resize() 中初始化)
transient Node<K,V>[] table;
//ket-value 集合
transient Set<Map.Entry<K,V>> entrySet;
// 元素个数
transient int size;
// 修改次数
transient int modCount;
// 容量阈值(元素个数超过该值会自动扩容)  
int threshold;
// 负载因子
final float loadFactor;
  • 当元素个数超过 threshold(容量阈值)时,HashMap 会进行扩容操作。
  • threshold = size * loadFactor

构造方法

/* 无参 */
public HashMap() {this.loadFactor = DEFAULT_LOAD_FACTOR;// 默认负载因子}
/* 传入初始容量 */
public HashMap(int initialCapacity) {this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
/* 传入初始容量和负载因子 */
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);
}

正文完
 0