其实这是一篇旧文,期间看了一些别的文章,说HashMap碰到冲突的时候,是用新值代替旧值,也就是说每个buckets只有一个Entry,然后怎么怎么样,就感觉到自己貌似写错了,后来就把这篇文章删除了.今天看到酷壳上《疫苗:Java HashMap的死循环》的文章后,发现我原来写的是对的(毕竟当时我也是看Java源码自己分析的),就想把这篇文章重新拿出来,但是期间git文件重新整理过,所以现在找不回来当时删除的文件了,不过还好当时截了一张图的.

从这件事也学到了,不能一味的相信网上别人的技术博客,不能偷懒,对于不理解的地方要去再读或者查资料搞懂,而不是简单的去相信作者.

比如上面链接的这篇文章,看下来后我对这句话不理解:

4)环形链接出现。
e.next = newTable[i] 导致  key(3).next 指向了 key(7)
注意:此时的key(7).next 已经指向了key(3), 环形链表就这样出现了。

然后就又回过头去看,这个newTable[i]中的i究竟是什么意思,后来知道了这个i其实就是当前e算出来的在rehash时的数组下标值,因为当前e是key(3),所以其i=3,而因为newTable[3]这个链表中当前的首个节点就是key(7),所以经过e.next = newTable[i],key(3).next就指向了key(7),也就形成了环形链表.

好了,下面这张图是以前所写的HashMap简析:

hashmap


blog comments powered by Disqus

Published

24 May 2013

Category

datastruct