关注
Q1:
知道Redis的字典吧,问你个问题,字典的底层数据结构知道怎么实现的吗?Java的HashMap不是采用的是数组加链表加红黑树,为什么这里的哈希表解决键冲突的时候用的是拉链法,而没有用到红黑树呢?
A:
字典的底层数据结构就是哈希表,而且使用的是两个哈希表,第一个哈希表用于存放数据,第二个哈希表用户扩容(Rehash),字典的结构是`type`、`ht`、`rehashIndex` 、`privatedata`
而关于HashMap中的键冲突问题,首先是采用拉链法,在java 1.8中,如果链表的长度超过了8,那么链表将转换为红黑树。(桶的数量必须大于64,小于64的时候只会扩容)发生hash碰撞时,java 1.7 会在链表的头部插入,而java 1.8会在链表的尾部插入。而且可以看到转换红黑树的时机是超过一定大小才会去转换,因为红黑树是一种自平衡二叉搜索树,它可以保证在**最坏情况**下,查找、插入和删除操作的时间复杂度为O(log n)。也就是说在规模不断增加的情况下,红黑树是比较不错的选择,但是如果规模比较小的话,就没必要采取红黑树了。
另外,Redis的哈希表会让键值对处于一个合理的区间(执行BGSAVE指令时,哈希表的负载因子大于等于1,未执行BGSAVE时,负载因子大于等于5执行扩展;哈希表的负载因子小于0.1自动执行收缩===》**执行BGSAVE命令时,Redis需要创建当前进程的子进程(写时复制优化子进程的使用效率),因此提高扩展所需要的负载因子,尽可能避免执行扩展,最大限度节约内存**),因此会自动进行Rehash去扩展与收缩,**查询性能消耗并不大,因此采取红黑树反而增加了性能耗费**。因此,并没有采用红黑树来实现哈希表的冲突扩展。
查看原帖
点赞 评论
相关推荐
牛客热帖
正在热议
# 25届秋招总结 #
248505次浏览 2018人参与
# 学历or实习经历,哪个更重要 #
41136次浏览 300人参与
# 北方华创开奖 #
22856次浏览 259人参与
# 地方国企笔面经互助 #
2559次浏览 6人参与
# 你最想要的公司福利是? #
40102次浏览 126人参与
# 选完offer后,你后悔学本专业吗 #
10600次浏览 76人参与
# 面试题刺客退退退 #
137212次浏览 2092人参与
# 国企/银行/研究所公司爆料 #
89757次浏览 412人参与
# 应届生被毁约被毁意向了怎么办 #
27189次浏览 238人参与
# 一觉醒来,我觉醒了超级打工人系统 #
2917次浏览 35人参与
# 机械应届生薪资要多少才合适? #
12398次浏览 60人参与
# 查收我的offer竞争力报告 #
16854次浏览 228人参与
# 校招入职后的感受 #
156975次浏览 1961人参与
# 你觉得第一学历对求职有影响吗? #
14898次浏览 121人参与
# 没有实习经历,还有机会进大厂吗 #
805195次浏览 13814人参与
# 我的工作日记 #
21223次浏览 270人参与
# 不给转正的实习,你还去吗 #
1517140次浏览 16970人参与
# 寒假躺平还是提前实习 #
58467次浏览 438人参与
# 总结:哪家公司面试体验感最差 #
25776次浏览 129人参与
# 秋招OC许愿 #
226744次浏览 1872人参与
# 如何写一份好简历 #
602326次浏览 8444人参与