概述

  • jdk1.7才会出现的死循环问题。
  • 扩容时在链表节点上才会出现此问题,因为采用的是头插法。

    过程

  • 扩容时,链表节点,经过计算会转移到新数组同一个位置的链表节点上。

    转移代码

    1. void transfer(Entry[] newTable, boolean rehash) {
    2. int newCapacity = newTable.length;
    3. // 遍历原数组
    4. for (Entry<K,V> e : table) {
    5. while(null != e) {
    6. Entry<K,V> next = e.next;
    7. if (rehash) {
    8. e.hash = null == e.key ? 0 : hash(e.key);
    9. }
    10. // 找到新数组对应位置
    11. int i = indexFor(e.hash, newCapacity);
    12. // 无论新数组对应位置是什么,都放到当前节点的下一个(这样兼容了链表节点和普通节点,因为普通节点的next会是null)
    13. e.next = newTable[i];
    14. // 把新节点作为头结点放在新数组
    15. newTable[i] = e;
    16. // 进行下一步循环
    17. e = next;
    18. }
    19. }
    20. }