java集合(7):TreeSet源码分析(jdk1.8)

前言

TreeSet是基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。这句话什么意思呢?就是说,跟HashSet底层是一个HashMap来维护类似,TreeSet的底层实现就是一个TreeMap,自然也就具备了对元素排序的功能。

正文

源码分析

1,TreeSet类名及类成员变量

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable {
    // 维护一个NavigableMap型变量,NavigableMap是TreeMap的接口
    private transient NavigableMap<E,Object> m;

    // PRESENT定义为静态常量,用来填充map的value位置 
    private static final Object PRESENT = new Object();
}

2,TreeSet类构造方法

    // 非公有构造方法,不对外开放,共其他公有构造方法调用
    TreeSet(NavigableMap<E,Object> m) {  
        this.m = m;
    }

    public TreeSet() { // 1,默认空参构造方法
        this(new TreeMap<E,Object>());  // 调用TreeMap类的无参构造方法
    }

    public TreeSet(Comparator<? super E> comparator) { // 2,自定义比较器的构造方法
        this(new TreeMap<>(comparator)); // 调用TreeMap类的比较器构造方法
    }

    public TreeSet(Collection<? extends E> c) { // 3,已知集合构造成TreeSet
        this();
        addAll(c);
    }

    public TreeSet(SortedSet<E> s) { // 4,已知SortedSet型集合构造成TreeSet
        this(s.comparator()); // 使用已知集合的比较器对象
        addAll(s);
    }

3,TreeSet常用方法,都是调用Treemap中的方法,只是在添加的时候用静态常量PRESENT来填充map的value位置。

4,iterator()迭代器方法,返回的就是map的keySet的迭代器。

总结

TreeSet底层实现严重依赖于TreeMap,所以弄清楚TreeMap是关键。

    原文作者:java集合源码分析
    原文地址: https://blog.csdn.net/qq_32166627/article/details/72779605
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞