头插法的初衷是设计者遵循一个新加进来的元素可能被使用的频率更高,这其实是一个伪命题,因为在hashmap扩容的时候,链表也是会发生颠倒的,因为是先从头节点开始转移掉新的hash表中。
头插法还有一个致命的缺点,就是在多线程下会出现循环链的情况,导致死循环
具体是怎么死循环的可以理解为因为扩容是会有一个颠倒的机制,所以多线程操作的时候有可能出现线程1让A->B 而线程2让B->A,导致了循环,
之所以会出现这个情况,核心在于这样一句代码,e.next = newTable[i];
这也就是头插法的代码,但是这样会出现一个问题就是,假如在原数组中是a指向b,当线程1完成元素迁移时若是a,b仍在一个索引那么会变成b指向a,但是此时线程二拿到CPU资源,但是在线程2中e指向的是a,那么此时执行e.next = newTable[i];就会变成a指向b,那么就形成了一个循环链表。
jdk1.8之后改为尾插法
自己的理解,希望指正
关于hashmap头插法和尾插法的理解
最新推荐文章于 2024-06-23 11:10:16 发布