hashmap
一.底层分析
- 1首先我们应该创建hashmap对象
2在第一次添加时,将table设置为Node类型的数组,初始长度为16,并将临界值计算为12(160.75)
3根据key值就算出一个hash值,在根据hash值去计算出当前数组索引范围内的索引值,
4.判断当前索引值是否有值如果没有,则直接添加(将值(Node)直接添加到当前索引位置)如果有值,继续判断hash值是否一致hash值不一致,则将当前数据添加到原来数据的next中hash值一致,继续判断内容是否一致,
如果一致则进行覆盖如果不一致继续将当前数据添加到原来数据的next中
5 在添加的数据超过临界值时,会自动扩容,扩容规则是原容量的两倍,并且扩容后,内部的数据会重新计算索引值
二. 源码追踪
a. 创建HashMap对象 将负载因子设置为 0.75
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
}
static final float DEFAULT_LOAD_FACTOR = 0.75f;
b. 在第一次添加时,将table设置为Node类型的数组,初始长度为16,并将临界值计算为12(160.75)
newCap = DEFAULT_INITIAL_CAPACITY;//16
newThr = (int)(DEFAULT_LOAD_FACTOR DEFAULT_INITIAL_CAPACITY);//0.7516
c. 在添加的数据超过临界值时,先添加,在去扩容
if (++size > threshold) 判断是否需要扩容
扩容规则是原容量的两倍
newCap = oldCap << 1
newThr = oldThr << 1
三 注意事项
扩容之后,内部的数据会重新计算索引值
1.8之前 HashMap底层是 Node[]+单向链表去实现的 (如果数据量比较大,单向链表有可能数据会比较多,查询效率会较低)
1.8 HashMap底层是 Node[]+单向链表+红黑树去实现的 单向链表的长度超过8,当前这个链表结构就会变为红黑树结构