jdk1.8 HashMap

capacity、threshold和loadFactor之间的关系

1、capacity table的容量,默认容量是16;

2、threshold table扩容的临界值,当table的size大于该值触发扩容;

3、loadFactor 负载因子,一般 threshold = capacity * loadFactor,默认的负载因子0.75是对空间和时间效率的一个平衡选择;

put操作

1、判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容;

2、根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,M转向6,如果table[i]不为空,转向3;

3、判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向4,这里的相同指的是hashCode以及equals;

4、判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向5;

5、遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可;

6、插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容。

resize过程

触发条件:当新增一个值时,插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容,步骤如下:

1、判断是否是最大值,是不再扩容,返回;

2、判断是否数组长度为0,是初始化长度为8;

3、没有超过最大值,扩容,大小为原来的2倍;

4、把旧的数组元素放到新的数组中,要不在原来的位置,要不在原来位置的2倍位置上;

https://blog.csdn.net/ltt1554287102/article/details/73549756

https://blog.csdn.net/Richard_Jason/article/details/53887222

你可能感兴趣的:(jdk1.8 HashMap)