补充部分:扩容涉及到扩容之后元素的整理问题,jdk8为了减少hashmpa冲突,使用了hash值和n进行&的操作,这么一来,同一个链表上的所有数据其实可以被划分为2类,一类是&操作之后为0的数据,保留在原位置,一类是&操作之后为1的数据,串起来放到新数组新位置上。
步骤1:首先判断是否为初次扩容,如果是,退出。如果不是,进入循环,循环遍历次数为数组中元素的个数
步骤2:(先把该节点赋值给e)判断数组中的当前节点是否为空,为空则进行下一轮循环
步骤3:如果不为空,则赋值为空,等待被GC回收。然后判断该节点是否有下一个节点,没有的话,则将该节点(通过e来获取)的hash值取出,来,并且与新数组的长度减1进行&运算,得到新的索引位置,再将e赋值给该位置。
步骤4:如果e结点后面仍然有兄弟节点,则会出现两种情况,要么后面是红黑树,要么就是链表,首先判断e节点是否为红黑树节点,是的话,在红黑树里面进行操作。
步骤5:不是红黑树的话,接下来要进行链表的移动,如补充部分所说的,同一类的连接到一起,给新数组赋值,赋值的时候只需要把各类的头部元素给数组索引位置就行。