• Java之TreeSet和TreeMap


    TreeSet和TreeMap之间的关系

    TreeSet的底层是TreeMap
    和HashSet和HashMap的关系一样

    TreeSet

    继承关系

    在这里插入图片描述
    Set接口的实现类
    关于Set接口可以看我的Java值单列集合

    基本介绍

    重点和其他的区别是,可以排序(按照你想要的方式)
    当我们使用无参构造器创建TreeSet时
    仍然是无序的
    如果你希望按照添加的元素按照字符串大小排序
    需要使用TreeSet一个构造器可以传入一个比较器Compartor(接口)
    使用匿名内部类在这里插入图片描述
    在这里插入图片描述
    但compare返回值只是一个数,要想真正了解怎么进行排序
    还是要看源码

    底层的排序机制

    在这里插入图片描述

    在这里插入图片描述
    TreeSet的底层是TreeMap
    把我们传入的比较器传给了TreeMap的一个属性comparator

    看add方法的运行比较机制
    在这里插入图片描述
    这里还是TreeSet的put方法

    然后到TreeMap的put方法

    这里我只截取了put方法里面的比较那一部分

      Comparator<? super K> cpr = comparator;//把我们的匿名内部类传给cpr
            if (cpr != null) {
                do {
                    parent = t;
                    cmp = cpr.compare(key, t.key);//调用我们定义的方法
                    if (cmp < 0)//返回值大于0,左边
                        t = t.left;
                    else if (cmp > 0)//返回值小于0,放右边
                        t = t.right;
                    else
                        return t.setValue(value);//等于0的换直接返回
                        //不会添加
                }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    key是我们传入的对象
    然后t.key是哪个比较的对象
    遵循compare规则
    key如果和t.key比较返回值大于0
    向左放
    小于0,向右放
    等于0,不添加

    TreeMap

    基本介绍

    在这里插入图片描述
    默认的话是按字符串的大小排序的大的放前面
    就是String的compareTo机制

    如果你想按照字符串长度比较
    可以这样设计
    在这里插入图片描述
    这里是Entry存放K-V
    如果你放两个字符串铲毒相同就放不进去了

    源码

    源码分析和前面的TreeSet相同

    Collections工具类

    在这里插入图片描述
    都是静态方法,且直接对集合进行操作
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    min和max情况差不多不写了
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    易错

    TreeMap和TreeSet
    使用无参构造的时候
    add/put进去的key值
    必须实现Compartor接口在这里插入图片描述
    解决方法
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/fbbcb0d36810451b9925867edce63f

    让Person实现Compartor接口并重写compareTo方法
    注意如果返回值都是0的话只能添加一个new Person()对象
    对比相同不添加

  • 相关阅读:
    Word文件不能编辑是什么原因?
    淘宝API接口介绍
    springboot基于itextpdf将html生成pdf
    【算法与数据结构】--常见数据结构--数组和链表
    [激光原理与应用-70]:AD8512运算放大器的工作原理与连接电路
    【0基础学Java第一课】-- 初始Java
    运行segment anything模型的web demo 教程
    enum枚举的使用
    深度学习(Python)学习笔记2
    一、C#—概述环境安装(1)
  • 原文地址:https://blog.csdn.net/y_k_j_c/article/details/126040744