Java - TreeSet源碼解析

來源:互聯網
上載者:User

標籤:http   start   有序   構造   each   remove   final   簡單   navig   

Java提高篇(二八)------TreeSet

 

與HashSet是基於HashMap實現一樣,TreeSet同樣是基於TreeMap實現的。在《Java提高篇(二七)-----TreeMap》中LZ詳細講解了TreeMap實現機制,如果客官詳情看了這篇博文或者多TreeMap有比較詳細的瞭解,那麼TreeSet的實現對您是喝口水那麼簡單。

一、TreeSet定義

我們知道TreeMap是一個有序的二叉樹,那麼同理TreeSet同樣也是一個有序的,它的作用是提供有序的Set集合。通過源碼我們知道TreeSet基礎AbstractSet,實現NavigableSet、Cloneable、Serializable介面。其中AbstractSet提供 Set 介面的骨幹實現,從而最大限度地減少了實現此介面所需的工作。NavigableSet是擴充的 SortedSet,具有了為給定搜尋目標報告最接近匹配項的導航方法,這就意味著它支援一系列的導航方法。比如尋找與指定目標最匹配項。Cloneable支援複製,Serializable支援序列化。

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

同時在TreeSet中定義了如下幾個變數。

private transient NavigableMap<E,Object> m;        //PRESENT會被當做Map的value與key構建成索引值對 private static final Object PRESENT = new Object();

其構造方法

// 預設建構函式。使用該建構函式,TreeSet中的元素按照自然排序進行排列。TreeSet()// 建立的TreeSet包含collectionTreeSet(Collection<? extends E> collection)// 指定TreeSet的比較子TreeSet(Comparator<? super E> comparator)// 建立的TreeSet包含setTreeSet(SortedSet<E> set)

 

二、TreeSet主要方法

1、add:將指定的元素添加到此 set(如果該元素尚未存在於 set 中)。

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

TreeSet的API

boolean                   add(E object)boolean                   addAll(Collection<? extends E> collection)void                      clear()Object                    clone()boolean                   contains(Object object)E                         first()boolean                   isEmpty()E                         last()E                         pollFirst()E                         pollLast()E                         lower(E e)E                         floor(E e)E                         ceiling(E e)E                         higher(E e)boolean                   remove(Object object)int                       size()Comparator<? super E>     comparator()Iterator<E>               iterator()Iterator<E>               descendingIterator()SortedSet<E>              headSet(E end)NavigableSet<E>           descendingSet()NavigableSet<E>           headSet(E end, boolean endInclusive)SortedSet<E>              subSet(E start, E end)NavigableSet<E>           subSet(E start, boolean startInclusive, E end, boolean endInclusive)NavigableSet<E>           tailSet(E start, boolean startInclusive)SortedSet<E>              tailSet(E start)

說明

(01) TreeSet是有序的Set集合,因此支援add、remove、get等方法。
(02) 和NavigableSet一樣,TreeSet的導航方法大致可以區分為兩類,一類時提供元素項的導航方法,返回某個元素;另一類時提供集合的導航方法,返回某個集合。
lower、floor、ceiling 和 higher 分別返回小於、小於等於、大於等於、大於給定元素的元素,如果不存在這樣的元素,則返回 null。

 

TreeSet不支援快速隨機遍曆,只能通過迭代器進行遍曆!

 

TreeSet遍曆測試程式如下:

import java.util.*;/** * @desc TreeSet的遍曆程式 * * @author skywang * @email [email protected] */public class TreeSetIteratorTest {    public static void main(String[] args) {        TreeSet set = new TreeSet();        set.add("aaa");        set.add("aaa");        set.add("bbb");        set.add("eee");        set.add("ddd");        set.add("ccc");        // 順序遍曆TreeSet        ascIteratorThroughIterator(set) ;        // 逆序遍曆TreeSet        descIteratorThroughIterator(set);        // 通過for-each遍曆TreeSet。不推薦!此方法需要先將Set轉換為數組        foreachTreeSet(set);    }    // 順序遍曆TreeSet    public static void ascIteratorThroughIterator(TreeSet set) {        System.out.print("\n ---- Ascend Iterator ----\n");        for(Iterator iter = set.iterator(); iter.hasNext(); ) {            System.out.printf("asc : %s\n", iter.next());        }    }    // 逆序遍曆TreeSet    public static void descIteratorThroughIterator(TreeSet set) {        System.out.printf("\n ---- Descend Iterator ----\n");        for(Iterator iter = set.descendingIterator(); iter.hasNext(); )            System.out.printf("desc : %s\n", (String)iter.next());    }    // 通過for-each遍曆TreeSet。不推薦!此方法需要先將Set轉換為數組    private static void foreachTreeSet(TreeSet set) {        System.out.printf("\n ---- For-each ----\n");        String[] arr = (String[])set.toArray(new String[0]);        for (String str:arr)            System.out.printf("for each : %s\n", str);    }}

 

 

三、最後

由於TreeSet是基於TreeMap實現的,所以如果我們對treeMap有了一定的瞭解,對TreeSet那是小菜一碟,我們從TreeSet中的源碼可以看出,其實現過程非常簡單,幾乎所有的方法實現全部都是基於TreeMap的。

 

Java - TreeSet源碼解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.