Java集合(12)——TreeSet源码解析

类图

这里写图片描述

官方文档

这里写图片描述

  1. TreeSet类实现了NavigableSet接口,因此它是有顺序的Set类,可以指定一个顺序,在元素存入时,按照指定的顺序排序
  2. 其中排序的顺序有两种方式:自然排序和比较器排序
  3. 自然排序
    • TreeSet类的add()方法中会把存入的对象提升为Comparable类型
    • 调用对象的compareTo()方法和集合中的对象比较
    • 根据compareTo()方法返回的结果进行存储
  4. 比较器排序
    • 创建TreeSet的时候可以制定 一个Comparator
    • 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
    • add()方法内部会自动调用Comparator接口中compare()方法排序
    • 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
  5. 两种排序方法的选择
    • TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
    • TreeSet如果传入Comparator, 就优先按照Comparator

成员变量

这里写图片描述

成员方法

这里写图片描述

这里写图片描述

成员方法源码解析

该类的很多方法都是通过调用NavigableMap类的对应方法实现的

1. TreeSet(NavigableMap<E,Object> m)方法
    TreeSet(NavigableMap<E,Object> m) {
        this.m = m;
    }

源码解析:

  • 功能:构造一个TreeSet集合,参数为NavigableMap类型的m
2. public TreeSet()方法
    public TreeSet() {
        this(new TreeMap<E,Object>());
    }

源码解析:

  • 功能:构造一个新的,空的TreeSet集合。因为TreeSet是一个有序的集合,因此在向该集合中插入元素是按照自然顺序进行插入,且插入的元素所属的类型需要实现Comparable接口,并且所有的元素都是需要可比较的。如果TreeSet中已经存储的元素是整型,插入的下一个元素是字符串类型,那么此时会抛出ClassCastException异常
3. public TreeSet(Comparator<? super E> comparator)方法
    public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }

源码解析:

  • 功能:将比较器comparator载入到当前TreeSet集合中,如果comparator是null,那么就会按照自然排序顺序排序
  • 源码思路:
    • 实现该功能通过创建新的TreeMap实现,且将comparator传入TreeMap构造器
4. public TreeSet(Collection<? extends E> c)方法
    public TreeSet(Collection<? extends E> c) {
        this();
        addAll(c);
    }

源码解析:

  • 功能:用现有的集合c中的元素来创建新的集合TreeSet
  • 源码思路:
    • (1) 首先调用当前类的this()构造函数
    • (2) 其次调用addAll(c)方法,将集合c中的元素放入当前对象中
5. public TreeSet(SortedSet<E> s)方法
    public TreeSet(SortedSet<E> s) {
        this(s.comparator());
        addAll(s);
    }

源码解析:
- 功能:构建一个新的TreeSet集合,其中集合s中的元素放在新创建的集合中,且新集合的比较方法与集合s的比较方法相同
- 源码思路:
- (1)首先调用当前集合的构造函数,将s集合的构造器作为参数传递给当前集合的构造器
- (2)其次调用addAll方法,将集合s的元素放入新集合中

6. public Iterator<E> iterator()方法
    public Iterator<E> iterator() {
        return m.navigableKeySet().iterator();
    }

源码解析:

  • 功能:返回当前集合的构造器
  • 源码思路:
    • 通过调用navigableKeySet的构造器作为当前集合的构造器,这个构造器是按照元素递增的方式
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值