关注
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去扩展与收缩,**查询性能消耗并不大,因此采取红黑树反而增加了性能耗费**。因此,并没有采用红黑树来实现哈希表的冲突扩展。
查看原帖
点赞 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 腾讯音乐求职进展汇总 #
57116次浏览 343人参与
# 你的秋招第一面感觉怎么样 #
61325次浏览 499人参与
# 牛友故事会 #
315928次浏览 8605人参与
# 互联网公司评价 #
348635次浏览 3627人参与
# 互联网回暖,腾讯要招5000+人! #
259024次浏览 4874人参与
# 怎么防止在试用期被辞退 #
110261次浏览 848人参与
# 秋招投简历越早越好吗 #
61063次浏览 605人参与
# 百度工作体验 #
188375次浏览 1845人参与
# 国企vs私企,怎么选? #
18179次浏览 157人参与
# 我在牛爱网找对象 #
161439次浏览 1224人参与
# 盲审过后你想做什么? #
9731次浏览 93人参与
# 面试等了一周没回复,还有戏吗 #
101276次浏览 938人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
89629次浏览 668人参与
# 聊聊这家公司值得去吗 #
195498次浏览 2061人参与
# 职业发展规划如何回答 #
29629次浏览 167人参与
# 没有实习经历还能找到好工作吗? #
6839次浏览 38人参与
# 25届网易互娱暑实进度 #
63007次浏览 603人参与
# 你认为工作的意义是什么 #
120106次浏览 908人参与
# 实习要如何选择和准备? #
19947次浏览 367人参与
# 你的办公桌上都有什么? #
3630次浏览 29人参与