TreeSet() 是使用二叉樹的原理對新 add() 的對象按照指定的順序排序(升序、降序),每增加一個對象都會進行排序,將對象插入的二叉樹指定的位置;
~
本篇內容包括:TreeSet 概述、TreeSet 的使用以及其他知識點
文章目錄
- 一、TreeSet 概述
- 二、TreeSet 的使用
- 1、構造方法
- 2、常用方法
- 三、其他知識點
- 1、關于 HashSet、LinkedHashSet 和 TreeSet 的區別
- 2、關于 紅黑樹的特點
- 3、關于 TreeSet 和 TreeMap 的區別
一、TreeSet 概述
TreeSet() 是使用二叉樹的原理對新 add() 的對象按照指定的順序排序(升序、降序),每增加一個對象都會進行排序,將對象插入的二叉樹指定的位置;
Integer 和 String 對象都可以進行默認的 TreeSet 排序,而自定義類的對象是不可以的,自己定義的類必須實現 Comparable 接口,并且覆寫相應的 compareTo()
函數,才可以正常使用;在覆寫 compare()
函數時,要返回相應的值才能使 TreeSet 按照一定的規則來排序
比較此對象與指定對象的順序。如果該對象小于、等于或大于指定對象,則分別返回負整數、零或正整數
TreeSet 的作用是保存無重復的數據,不過還對這些數據進行了排序。TreeMap 的底層是通過紅黑樹實現的,所以 TreeSet 底層也是通過紅黑樹實現的。TreeSet 最主要的特點就是對元素進行了排序。其特點如下:
- TreeSet 是基于 TreeMap 的 NavigableSet 實現;
- TreeSet 的元素存儲在 TreeMap 中的 key 中,TreeMap 的 value 是一個常量對象;
- 非線程安全;
- java8 新增分割器
spliterator()
方法
二、TreeSet 的使用
1、構造方法
方法名 | 方法說明 | 方法名 | 方法說明 |
---|---|---|---|
public TreeSet() | 無參構造方法,完成 map 的創建; | public TreeSet(Comparator<? super E> comparator) | 構造TreeSet,根據指定的比較器進行排序 |
public TreeSet(Collection<? extends E> c) | 構造一個包含指定集合中的元素的TreeSet,根據其元素的自然排序進行比較 | public TreeSet(SortedSet<E> s) | 構造TreeSet,并使用與指定排序集相同的順序 |
2、常用方法
方法名 | 方法說明 | 方法名 | 方法說明 |
---|---|---|---|
boolean add(E e) | 添加一個元素,如果該元素已經存在,則返回true,如果不存在,則返回false | boolean addAll(Collection<? extends E> c) | 添加一個包含指定元素的集合 |
boolean remove(Object o) | hashSet的迭代器 | void clear() | 獲得大小 |
NavigableSet<E> headSet(E toElement, boolean inclusive) | 返回子 Set | NavigableSet<E> tailSet(E fromElement, boolean inclusive) | 返回Set的尾部,范圍是:從fromElement到結尾。 |
E first() | 返回Set的第一個元素 | E last() | 返回Set的最后一個元素 |
E lower(E e) | 返回Set中小于e的最大元素 | E floor(E e) | 返回Set中小于/等于e的最大元素 |
E ceiling(E e) | 返回Set中大于/等于e的最小元素 | E higher(E e) | 返回Set中大于e的最小元素 |
E pollFirst() | 獲取第一個元素,并將該元素從TreeMap中刪除 | E pollLast() | 獲取最后一個元素,并將該元素從TreeMap中刪除 |
void writeObject(java.io.ObjectOutputStream s) | 將TreeSet的“比較器、容量,所有的元素值”都寫入到輸出流中 | void readObject(java.io.ObjectInputStreams) | 從輸入流中讀取TreeSet的“比較器、容量,所有的元素值” |
三、其他知識點
1、關于 HashSet、LinkedHashSet 和 TreeSet 的區別
- HashSet 是 Set 接口的主要實現類 ,HashSet 的底層是 HashMap,線程不安全的,可以存儲 null 值;
- LinkedHashSet 是 HashSet 的子類,能夠按照添加的順序遍歷;
- TreeSet 底層使用紅黑樹,能夠按照添加元素的順序進行遍歷,排序的方式可以自定義。
2、關于 紅黑樹的特點
- 性質 1:每個節點要么是紅色,要么是黑色。
- 性質 2:根節點永遠是黑色的。
- 性質 3:所有的葉節點都是空節點(即 null),并且是黑色的。
- 性質 4:每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的路徑上不會有兩個連續的紅色節點)
- 性質 5:從任一節點到其子樹中每個葉子節點的路徑都包含相同數量的黑色節點。
3、關于 TreeSet 和 TreeMap 的區別
TreeMap 和 TreeSet 是 Java Collection Framework 的兩個重要成員,其中 TreeMap 是 Map 接口的常用實現類,而 TreeSet 是 Set 接口的常用實現類。雖然 TreeMap 和TreeSet 實現的接口規范不同,但 TreeSet 底層是通過 TreeMap 來實現的(如同HashSet底層是是通過HashMap來實現的一樣),因此二者的實現方式完全一樣。而 TreeMap 的實現就是紅黑樹算法
不同點:
- 最主要的區別就是 TreeSet 和 TreeMap 分別實現 Set 和 Map 接口
- TreeSet 只存儲一個對象,而 TreeMap存 儲兩個對象 Key 和 Value(僅僅key對象有序)
- TreeSet 中不能有重復對象,而 TreeMap 中可以存在
- TreeMap 的底層采用紅黑樹的實現,完成數據有序的插入,排序。