当前位置:   article > 正文

Java之TreeSet和TreeMap_java treemap转treeset

java treemap转treeset

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

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/991700
推荐阅读
相关标签
  

闽ICP备14008679号