HashMap-思考

1.并发会有什么影响
第一:多线程put的时候可能导致元素丢失

考虑在多线程下put操作时,执行addEntry(hash, key, value, i),如果有产生哈希碰撞,
导致两个线程得到同样的bucketIndex去存储,就可能会出现覆盖丢失的情况

第二:HashMap在多线程put后可能导致get无限循环
答:多次put扩容后就会去扩容

2.为什么头插换成了尾插

第三:扩容机制造成的死循环问题(jdk1.8以前)
答:
插入节点:1-》2-》3-》4-》5 3的上游是2 下游是4
扩容时 第一个线程执行到 3-》2-》1 此时 3的下游是2
这时 如果第二个线程到来 他去执行时 取到3 的下游是2 就变成了 2-》3-》2-》1 发生了死循环 成为了一个环状 这也是为什么jdk1.8把头插换成了尾插
如果是尾插
插入节点:1-》2-》3-》4-》5 3的上游是2 下游是4
扩容时 第一个线程执行到 1-》2-》3 此时 3的上游还是是2 说明上下游没有发生变化
第二个线程来的时候 节点的上下游并没有发生变化 所以不会出现死循环

参考资料:https://www.jianshu.com/p/bf5926b6dcde

 

 3.为什么用红黑树

红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树(高度差最多为-1),因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。所以红黑树的插入效率更高

红黑树的查询性能略微逊色于AVL树,因为他比avl树会稍微不平衡最多一层,也就是说红黑树的查询性能只比相同内容的avl树最多多一次比较,但是,红黑树在插入和删除上完爆avl树,avl树每次插入删除会进行大量的平衡度计算,而红黑树为了维持红黑性质所做的红黑变换和旋转的开销,相较于avl树为了维持平衡的开销要小得多

posted @ 2020-07-17 10:11  我是张某某  阅读(157)  评论(0)    收藏  举报