1.类图

截屏2021-07-06 下午3.26.40.png

  1. public class TreeSet<E> extends AbstractSet<E>
  2. implements NavigableSet<E>, Cloneable, java.io.Serializable {}

TreeSet继承了抽象类AbstractSet,实现了NavigableSet、Cloneable、Serializable接口

  • NavigableSet:导航方法,treeMap实现的接口
  • Cloneable:可以克隆
  • Serializable:可以被序列化

与HashSet类似,TreeSet底层是通过TreeMap实现的。底层是红黑树,加入了排序功能,升序遍历。

2.成员变量

  1. //存放元素的集合
  2. private transient NavigableMap<E,Object> m;
  3. //PRESENT就是上面NavigableMap中的Object,类似于hashSet的作用
  4. private static final Object PRESENT = new Object();

3. 构造方法

  1. public TreeSet() {
  2. this(new TreeMap<E,Object>());
  3. }
  4. public TreeSet(Comparator<? super E> comparator) {
  5. this(new TreeMap<>(comparator));
  6. }
  7. public TreeSet(Collection<? extends E> c) {
  8. this();
  9. addAll(c);
  10. }
  11. public TreeSet(SortedSet<E> s) {
  12. this(s.comparator());
  13. addAll(s);
  14. }
  15. TreeSet(NavigableMap<E,Object> m) {
  16. // 通过多态的形式生成了一个TreeMap并赋值给了m。
  17. // NavigableMap<E,Object> m = new TreeMap<E,Object>()
  18. this.m = m;
  19. }

底层就是new一个TreeMap来实现的,我们还可以定义自己的比较器和排序器。

4.方法

4.1 继承于AbstractCollection的方法

截屏2021-07-06 下午3.38.01.png
类似于hashSet,增删改的方法全部来自于AbstractCollection,底层实现调用了treeMap的方法。

  1. public boolean add(E e) {
  2. return m.put(e, PRESENT)==null;
  3. }
  4. public boolean contains(Object o) {
  5. return m.containsKey(o);
  6. }
  7. public boolean remove(Object o) {
  8. return m.remove(o)==PRESENT;
  9. }
  10. public void clear() {
  11. m.clear();
  12. }
  13. public int size() {
  14. return m.size();
  15. }
  16. public boolean isEmpty() {
  17. return m.isEmpty();
  18. }
  19. public Iterator<E> iterator() {
  20. return m.navigableKeySet().iterator();
  21. }

4.2 实现NavigableSet的方法

这所有的方法底层基本上也都调用了treeMap的方法

  • 返回子set

    1. //底层其实就是通过TreeMap的subMap()实现的
    2. public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
    3. E toElement, boolean toInclusive) {
    4. return new TreeSet<>(m.subMap(fromElement, fromInclusive,
    5. toElement, toInclusive));
    6. }
  • 返回set的头部与尾部

    1. // 返回Set的头部,范围是:从头部到toElement。
    2. // inclusive:是否包含toElement的标志
    3. public NavigableSet<E> headSet(E toElement, boolean inclusive) {
    4. return new TreeSet<E>(m.headMap(toElement, inclusive));
    5. }
    6. // 返回Set的尾部,范围是:从fromElement到结尾。
    7. public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
    8. return new TreeSet<E>(m.tailMap(fromElement, inclusive));
    9. }
  • 返回特定元素

    1. // 返回Set的第一个元素
    2. public E first() { return m.firstKey(); }
    3. // 返回Set的最后一个元素
    4. public E last() { return m.lastKey(); }
    5. // 返回Set中小于e的最大元素
    6. public E lower(E e) { return m.lowerKey(e); }
    7. // 返回Set中小于/等于e的最大元素
    8. public E floor(E e) { return m.floorKey(e);}
    9. // 返回Set中大于/等于e的最小元素
    10. public E ceiling(E e) { return m.ceilingKey(e);}
    11. // 返回Set中大于e的最小元素
    12. public E higher(E e) { return m.higherKey(e);}
  • 返回特定元素并移除

    1. // 获取第一个元素,并将该元素从TreeMap中删除。
    2. public E pollFirst() {
    3. Map.Entry<E,?> e = m.pollFirstEntry();
    4. return (e == null)? null : e.getKey();
    5. }
    6. // 获取最后一个元素,并将该元素从TreeMap中删除。
    7. public E pollLast() {
    8. Map.Entry<E,?> e = m.pollLastEntry();
    9. return (e == null)? null : e.getKey();
    10. }