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的换直接返回
                    //不会添加
            }

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()对象
对比相同不添加

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小袁拒绝摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值