2021-07-25 22:25
门头沟学院 Java 0 点赞 评论 收藏
分享

0 点赞 评论 收藏
分享
_175:求租房群

0 点赞 评论 收藏
分享

0 点赞 评论 收藏
分享
jjoobb:确实不太好,面试官就一直问啊问啊,贼严肃

0 点赞 评论 收藏
分享

0 点赞 评论 收藏
分享
0 点赞 评论 收藏
分享
SC11010:关于hashmap的翻倍扩容,我有一点理解,抛砖引玉,同学你可以参考一下
1. 1.8之前用头插法,因为头插法快,毕竟拉链法是没有维护尾指针的(印象中应该是没有),每次尾插是需要定位到尾节点的
2. 1.8针对hashmap并发环境下的隐患,改成了尾插,但是如1所说,性能是个问题
3. 1.8的容量要求是2的幂次,然后翻倍扩容,这样会出现这么一种情况:容量n的表,位置a的元素,在扩容后只会出现在两个地方,a或n+a,举个例子,容量是4的表,0号位置的元素可能是0、4、8,如果翻倍扩容,0--0,4--4,8--0,但是如果是一半扩容,0--0,4--4,8--1
4. 你去看一下1.8的扩容,它是先存储在一个链表中(因为按照3,所有需要迁移的元素都会到同一个位置),最后在把链表放到散列位置的。这样就解决了2里面的性能问题。
5. 其实如果不是2的幂次,定位散列位置也很快,都是(newSize-1)&hashCode
6. 有个细节可以注意一下,哈希值的获取其实是结合了高位与低位,避免了只有高位变化时候的哈希冲突,源码上好像有解释
个人理解,不一定对,有问题请指正😁

0 点赞 评论 收藏
分享
创作者周榜
更多
关注他的用户也关注了: