关于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. 有个细节可以注意一下,哈希值的获取其实是结合了高位与低位,避免了只有高位变化时候的哈希冲突,源码上好像有解释 个人理解,不一定对,有问题请指正😁
3 4

相关推荐

专业嗎喽:个人信息名字太大,合到电话邮箱那一栏就行,有党员写过党,剩下其他全删,站空太大了 把实习经历丰富,放最前面,然后是个人评价,技能之类的,然后是学校信息。项目经历最后面,可以就选一个自己擅长的。 现在是学校不是92就扣分的,没必要放前面。 然后现在看重实习经历>竞赛经历(校园经历)>课程项目经历
点赞 评论 收藏
分享
11-27 10:14
复旦大学 Java
一念星空:大佬,可以帮我看一下简历吗
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务