本文将通过如下简单的代码来分析HashMap的内部数据结构的变化过程。
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
for (int i = 0; i < 50; i++) {
map.put("key" + i, "value" + i);
}
}
1.数据结构说明
HashMap中本文需要用到的几个字段如下:
下面说明一下几个字段的含义
1)table
// HashMap内部使用这个数组存储所有键值对
transient Node<K,V>[] table;
Node的结构如下:
可以发现,Node其实是一个链表,通过next指向下一个元素。
2)size
记录了HashMap中键值对的数量
3)modCount
记录了HashMap在结构上更改的次数,包括可以更改键值对数量的操作,例如put、remove,还有可以修改内部结构的操作,例如rehash。
4)threshold
记录一个临界值,当已存储键值对的个数大于这个临界值时,需要扩容。
5)loadFactor
负载因子,通常用于计算threshold,threshold=总容量*loadFactor。
2.new HashMap
new HashMap的源码如下:
/**
* The load factor used when none specified in constructor.
* 负载因子,当 已使用容量 > 总容量 * 负载因子 时,需要扩容
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
此时,HashMap只初始化了负载因子(使用默认值