【JAVA学习笔记】TreeMap 探究

前言

文章仅是笔者个人的学习笔记,存在一些只有笔者个人能看到的用词或者描述,如果有不明确的地方,欢迎留言,理性讨论。

一、红黑树

  1. 虽然谈红色变,但是对于 TreeMap 确实是不谈不行,因为 TreeMap 的底层实现就是 红黑树。
  2. 这里贴一段对红黑树的介绍吧,实际上主要是要了解红黑树的性质,至于具体的实现,还是不要花太多时间了。
红黑树顾名思义就是节点是红色或者黑色的平衡二叉树。
它通过颜色的约束来维持着二叉树的平衡。
对于一棵有效的红黑树二叉树而言我们必须增加如下规则:

1. 每个节点都只能是红色或者黑色
2. 根节点是黑色
3. 每个叶节点(NIL节点,空节点)是黑色的。
4. 如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

  1. 红黑树的三个动作:
    1. 左旋
    2. 右旋
    3. 着色:参考上面的5条准则
  2. 红黑树对比平衡二叉树:
    1. 平衡二叉树的平衡是严格的,必须满足所有节点的左右子树高度差的绝对值不超过1,这虽然使得它查找的速度可以非常快,但是维持这种平衡也需要更高的开销
    2. 红黑树放弃了完全平衡,转而寻求动态平衡,保证了每次插入最多只需要三次旋转就能平衡

二、TreeMap概述

  1. TreeMap 的本质是红黑树,它的继承结构如下:
    1. 这里有两个接口需要注意:
      1. TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
      2. TreeMap 实现了Cloneable接口,意味着它能被克隆。
  2. TreeMap可以实现Key的排序(自然顺序排序,或者通过提供比较器,进行自定义排序)
  3. TreeMap是非线程安全的

三、TreeMap源码分析

  1. **构造方法:**可以使用默认的,或者传入一个比较器进行自定义排序,也可以传入已有的一个map。
  2. 添加(简略概述):
    1. 将红黑树当成一颗二叉查找树,将节点插入(因为红黑树本身就是一个二叉查找树)
    2. 将新插入的节点设置为红色(有没有疑问,为什么新插入的节点一定要是红色的,因为新插入节点为红色,不会违背红黑规则第(5)条,少违背一条就少处理一种情况。)
    3. 通过旋转和着色,使它恢复平衡,重新变成一颗符合规则的红黑树。
  3. 删除(简略概述):
    1. 将红黑树当成一颗二叉查找树,将节点删除。
    2. 通过旋转和着色,使它恢复平衡,重新变成一颗符合规则的红黑树。
  4. **查找:**就是二叉查找树的查找方法,传入target,target小于当前节点,就往当前节点左子树找,大于就往右子树找
  5. **遍历方式:**遍历键值对、遍历KEY、遍历VALUE,没什么特别的

四、总结

  1. 总的来说,学的是比较不求甚解的,因为红黑树确实实现原理比较复杂,而客户端开发又基本上不可能要求去实现一颗红黑树。
  2. 对红黑树的操作都是先把它当成普通的二叉查找树来进行,插入、删除,然后再将它旋转至符合红黑树的要求。
  3. 所以,TreeMap本质上是对红黑树的封装,而红黑树本质上是 一颗自平衡的二叉查找树 (待学习。

五、引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值