絮叨学校短学期刚结束了,离学校开学还有很多天,一直呆在寝室玩游戏岂不是浪费了大好时光,于是心血来潮想看看HashMap的源码 。虽然我没有经历过面试,但是JAVA程序员都知道,HashMap是面试官必问的知识点,而我现在只停留在对HashMap的基本使用层面,因此我觉得有必要深入了解一下HashMap的底层原理 。在HashMap中,我觉得最难的应该是红黑树了吧,我结合代码和画图软件研究了两天,终于总结出规律,现在分享给大家
一、红黑树的特点下面是红黑树的5条性质,现在大家要对这些性质有印象,后面我会结合图解的形式,多次提到这些性质来帮助大家记忆
- 每个节点要么是红的,要么是黑色的
- 跟节点一定是黑色的
- 叶子节点一定是黑色的(叶节点一般不画,在末尾节点上,没有内容)
- 红节点下的两个子节点一定是黑色的
- 任意一条从根节点到叶子节点的路径中黑色节点的个数相等
二、红黑树的优点谈到红黑树的优点,就不得不拿出AVL树来进行比较 。
AVL树是完全平衡的树,根的最大深度和最小深度相差不大于1,查找效率比较高,而红黑树不是完全平衡树,查找效率略低于AVL树
红黑树的插入和删除操作比AVL树快很多,因为红黑树保证插入删除时最多需要旋转三次就可以达到平衡,而AVL树每次插入删除会进行大量的平衡度计算,开销很大
因此,红黑树牺牲了一点点查找效率,使它有更快的插入删除操作,综合来说,红黑树性能高于AVL树
三、红黑树插入如何平衡3.1 红黑树插入基本规则
- 新插入的节点是红的
- 父节点是黑的,或者父节点是根节点,直接插入
- 父节点是红的,需要变色、旋转(也就是出现两个连在一起的红节点失去平衡)
- 如果一次平衡后出现祖父节点和祖父节点的父亲是红的,那么把祖父节点当做新节点,继续变色翻转,知道整体平衡(递归思想)
3.2.1 新节点没有叔叔节点,或者叔叔节点是黑的
![看了两天HashMap源码,终于把红黑树插入平衡规则搞懂了](http://img.jiangsulong.com/220422/0P91LG4-0.jpg)
文章插图
这种情况只要把父节点变黑,祖父节点变红就ok了
![看了两天HashMap源码,终于把红黑树插入平衡规则搞懂了](http://img.jiangsulong.com/220422/0P91I356-1.jpg)
文章插图
这种情况不但要把父节点变黑,祖父节点变红,还要考虑祖父节点是否是根节点,在
推荐阅读
- 排卵试纸连续两天强阳说明什么问题?
- 排卵试纸强阳两天为什么会出现这种现象
- |看了这篇文章,你还敢让自己做职场上可有可无的人吗???!!!
- nginx 端口转发
- HashMap这次是真的懂了,扰动函数、负载因子、扩容拆分全搞定
- 胡萝卜渣饼的做法
- 记两天与木马惊心动魄的斗争经历
- 每个工程师都应该知道的关于Hashmap的知识
- GO 切片实力踩坑
- 蒜苗鸡蛋饼的做法