此时,由于 e=A,不为空,继续循环。
//第三次循环 e=A;next=null; // A节点后边已经没有节点了 e.next= B->A->null // B->A->null 为第二次循环后线程一新数组的结构 //我们把A插入后,抽象的表达为 A->B->A->null,但是,A只能是一个,不能分身啊 //因此实际上是 e(A).next指向发生了变化,A的 next 由指向 null 改为指向了 B, //而 B 本身又指向A,因此A和B互相指向,成环 newTab[i] = A->B 且 B->A e=next=null; //e此时为空,结束循环第三次循环结束后,看下图,A的指向由 null ,改为指向为 B,因此 A 和 B 之间成环。
这时,有的同学可能就会问了,就算他们成环了,又怎样,跟死循环有什么关系?
我们看下 get() 方法(最终调用 getEntry 方法),
可以看到查找元素时,只要 e 不为空,就会一直循环查找下去。若有某个元素 C 的 hash 值也落在了和 A,B元素同一个桶中,则会由于, A,B互相指向,e.next 永远不为空,就会形成死循环。