HashMap 数据结构为 数组+链表,其中:链表的节点存储的是一个 Entry 对象,每个Entry 对象存储四个属性(hash,key,value,next)
数据结构:
- 整体是一个数组;
- 数组每个位置是一个链表;
- 链表每个节点中的Value即我们存储的Object;
工作原理
初始化 HashMap,提供了有参构造和无参构造,
无参构造中,容器默认的数组大小 initialCapacity 为 16,加载因子loadFactor 为0.75。
容器的阈(yu)值为 initialCapacity loadFactor,默认情况下阈值为 16 0.75 = 12
扩容机制:
HashMap 使用 “懒扩容” ,只会在 PUT 的时候才进行判断,然后进行扩容。
将数组长度扩容为原来的2 倍
将原来数组中的元素进行重新放到新数组中
需要注意的是,每次扩容之后,都要重新计算原来的 Entry 在新数组中的位置,原因如下
static int indexFor(int h, int length) { // h 为key 的 hash值;length 是数组长度
return h & (length-1);
}
由源码得知,元素所在位置是和数组长度是有关系的,既然扩容后数组长度发生了变化,元素位置肯定会变