1. 程式人生 > >容器原始碼分析之TreeSet(五)

容器原始碼分析之TreeSet(五)

HashSet是藉助於HashMap的key不允許重複這個特性來實現的。HashMap是操作鍵值對,而HashSet是操作HashMap的key完成相關操作,TreeSet比HashSet加了排序的功能,那是不是TreeSet也因應該是通過操作TreeMap來實現的呢?
right!!

先把HashSet的連結發上來,一樣的部分就不多解釋了:
容器原始碼分析之HashSet(四)

1.TreeSet的繼承結構

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

2.TreeSet的屬性

    private transient NavigableMap<E,Object> m;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

這樣看起來其實TreeSet跟HashSet一樣,區別是HashSet的Map成員是HashMap,而TreeSet的Map成員是NavigableMap介面,為什麼是NavigableMap介面而不直接是TreeMap呢?

Effective Java之通過介面引用物件(五十二)

3. TreeSet的建構函式

    //傳map
    TreeSet(NavigableMap<E,Object> m) {
        this.m = m;
    }

    //預設
     public TreeSet() {
        this(new TreeMap<E,Object>());
    }

    //定製排序方式
      public TreeSet(Comparator<? super E> comparator) {
        this
(new TreeMap<>(comparator)); } //傳集合 public TreeSet(Collection<? extends E> c) { this(); addAll(c); }

從上述可以看出,TreeSet的建構函式都是通過新建一個TreeMap作為實際儲存Set元素的容器,所以TreeSet裡絕大部分方法都是直接呼叫 TreeMap 的方法來實現的。

4. TreeSet的常用方法

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

   public Iterator<E> iterator() {
        return m.keySet().iterator();
    }
   public int size() {
        return m.size();
    }

    public boolean isEmpty() {
        return m.isEmpty();
    }

    public boolean contains(Object o) {
        return m.containsKey(o);
    }

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

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

    public void clear() {
        m.clear();
    }

這些方法和HashSet常用方法幾乎一模一樣