JDK1.7或之前版本最大的区别就是扩容时只使用的链表,而JDK1.8及以后除了链表,还使用了红黑树。
我们重点看下JDK1.8版本及以上版本的原理。
1、先生成新的数组。
2、遍历老数组中的每个为位置上的链表或者是红黑树。
3、如果它是链表的话,则直接将链表中的每一个元素重新计算一下下标,并添加到新的数组中去。
4、如果是红黑树的话,则先遍历红黑树,计算出红黑树中每个元素对应在新数组中的下标位置,统计每个下标位置的元素个数,如果该位置下的元素个数超过了8个,则生成一个新的红黑树,并将根节点的添加到新数组的对应位置。如果该位置下的元素个数没有超过8个,那么则生成一个链表,并将链表的头节点添加到新数组的对应位置。
5、所有的元素转移完了之后,将新数组复制给HashMap对象的table属性。