Java7可能會出現死循環、Java8尾插法不會


Java7可能會出現死循環、Java8尾插法不會

因為resize的賦值方式,也就是使用了單鏈表的頭插入方式,同一位置上新元素總會被放在鏈表的頭部位置,在舊數組中同一條Entry鏈上的元素,通過重新計算索引位置後,有可能被放到了新數組的不同位置上使用頭插會改變鏈表的上的順序,但是如果使用尾插,在擴容時會保持鏈表元素原本的順序,就不會出現鏈表成環的問題了。

Java7在多線程操作HashMap時可能引起死循環,原因是擴容轉移後前後鏈表順序倒置,在轉移過程中修改了原來鏈表中節點的引用關係。Java8在同樣的前提下並不會引起死循環,原因是擴容轉移後前後鏈表順序不變,保持之前節點的引用關係。


分享到:


相關文章: