集合包系列六 —— TreeSet

本系列文章所描述的所有类或接口都是基于 JDK 1.7的源码,在其它 JDK 的实现方式中可能会有所不同。

一、实现方式

TreeSet 和 HashSet 的主要不同在于 TreeSet 对于排序的支持,TreeSet 基于 TreeMap 实现。

二、创建 TreeSet

此时所要做的就是创建一个 TreeMap 对象。

    public TreeSet() {
        this(new TreeMap());
    }

    TreeSet(NavigableMap m) {
        this.m = m;
    }

    public TreeSet(Collection c) {
        this();
        addAll(c);
    }

    public TreeSet(Comparator comparator) {
        this(new TreeMap<>(comparator));
    }

    public TreeSet(SortedSet s) {
        this(s.comparator());
        addAll(s);
    }

三、添加元素 add(E)

调用 TreeMap 的 put(Object, Object) 方法完成此操作,用要增加的元素作为 key,用之前已创建的一个 final 的 Object 对象作为 value。

    public boolean add(E e) {
        return m.put(e, PRESENT)==null;
    }

四、删除元素 remove(E)

调用 TreeMap 的 remove(Object) 方法完成此操作。

    public boolean remove(Object o) {
        return m.remove(o)==PRESENT;
    }

五、遍历元素 iterator()

调用 TreeMap 的 navigableKeySet 的 iterator 方法完成此操作。

    public Iterator iterator() {
        return m.navigableKeySet().iterator();
    }

综上所述,TreeSet 和 HashSet 一样,也是完全基于 Map 来完成的,并且同样也不支持 get(int) 来获取指定位置的元素,只是 TreeSet 基于的是 TreeMap,除了这些基本的 Set 实现外,TreeSet 还提供了一些排序方面的支持。例如传入 Comparator 实现、descendingSet 以及 descendingIterator 等。

六、注意要点

对于 TreeSet 而言,最要注意的有以下几点:

  • TreeSet 基于 TreeMap 实现,支持排序;
  • TreeSet 是非线程安全的。

你可能感兴趣的:(集合包系列六 —— TreeSet)