简介
HashMap 是一种Java中常用的数据结构,采用数组+链表+红黑树的方式存储键值对数据,通过哈希函数散列映射方式,使得HashMap的查询数据的数据比较快。
HashMap结构如下图所示:
一、主要的成员变量
// 当前存储数据容量
transient int size;
// 当size 大于threshold时,将触发扩容操作
int threshold;
// 加载因子
final float loadFactor;
// 修改数据次数
transient int modCount;
// 默认初始容量 16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
//最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;
//默认加载因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;
//当链表长度大于该值时,链表转为红黑树
static final int TREEIFY_THRESHOLD = 8;
// 当红黑树节点数小于该值时,转为链表
static final int UNTREEIFY_THRESHOLD = 6;
//存储数据的数组
transient Node<K,V>[] table;
当HashMap的容量大于threshold的值时,将进行扩容;
默认情况下,HashMap容量为16,加载因子为0.75,即当HashMap中的数据量达到 16 X 0.75 = 12 时,将触发扩容操作。
实际存储键值对的是Node内部类:
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
二、初始化
HashMap有四个构造函数:
// 不带参构造函数,加载因子为默认的0.75
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
// 指定初始容量,加载因子为默认的0.75
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
// 另一个map对象,初始化后,将存放该map对象的引用
public HashMap(Map<? extends K, ? extends V> m) {
this.loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}
// 指定初始容量和加载因子
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</