天天看點

Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例

這一章,我們對TreeSet進行學習。

我們先對TreeSet有個整體認識,然後再學習它的源碼,最後再通過執行個體來學會使用TreeSet。内容包括:

<a href="http://www.cnblogs.com/skywang12345/p/3311268.html#a1">第1部分 TreeSet介紹</a>

<a href="http://www.cnblogs.com/skywang12345/p/3311268.html#a2">第2部分 TreeSet資料結構</a>

<a href="http://www.cnblogs.com/skywang12345/p/3311268.html#a3">第3部分 TreeSet源碼解析(基于JDK1.6.0_45)</a>

<a href="http://www.cnblogs.com/skywang12345/p/3311268.html#a4">第4部分 TreeSet周遊方式</a>

<a href="http://www.cnblogs.com/skywang12345/p/3311268.html#a5">第5部分 TreeSet示例</a>

TreeSet簡介

TreeSet 是一個有序的集合,它的作用是提供有序的Set集合。它繼承于AbstractSet抽象類,實作了NavigableSet&lt;E&gt;, Cloneable, java.io.Serializable接口。

TreeSet 繼承于AbstractSet,是以它是一個Set集合,具有Set的屬性和方法。

TreeSet 實作了NavigableSet接口,意味着它支援一系列的導航方法。比如查找與指定目标最比對項。

TreeSet 實作了Cloneable接口,意味着它能被克隆。

TreeSet 實作了java.io.Serializable接口,意味着它支援序列化。

TreeSet是基于TreeMap實作的。TreeSet中的元素支援2種排序方式:自然排序 或者 根據建立TreeSet 時提供的 Comparator 進行排序。這取決于使用的構造方法。

TreeSet為基本操作(add、remove 和 contains)提供受保證的 log(n) 時間開銷。

另外,TreeSet是非同步的。 它的iterator 方法傳回的疊代器是fail-fast的。

TreeSet的構造函數

Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例
Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例

TreeSet的API

Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例
Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例

說明:

(01) TreeSet是有序的Set集合,是以支援add、remove、get等方法。

(02) 和NavigableSet一樣,TreeSet的導航方法大緻可以區分為兩類,一類時提供元素項的導航方法,傳回某個元素;另一類時提供集合的導航方法,傳回某個集合。

lower、floor、ceiling 和 higher 分别傳回小于、小于等于、大于等于、大于給定元素的元素,如果不存在這樣的元素,則傳回 null。

TreeSet的繼承關系

Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例
Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例

TreeSet與Collection關系如下圖:

Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例

從圖中可以看出:

(01) TreeSet繼承于AbstractSet,并且實作了NavigableSet接口。

為了更了解TreeSet的原理,下面對TreeSet源碼代碼作出分析。

Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例
Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例
Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例

總結:

(01) TreeSet實際上是TreeMap實作的。當我們構造TreeSet時;若使用不帶參數的構造函數,則TreeSet的使用自然比較器;若使用者需要使用自定義的比較器,則需要使用帶比較器的參數。

(02) TreeSet是非線程安全的。

(03) TreeSet實作java.io.Serializable的方式。當寫入到輸出流時,依次寫入“比較器、容量、全部元素”;當讀出輸入流時,再依次讀取。

4.1 Iterator順序周遊

4.2 Iterator順序周遊

4.3 for-each周遊HashSet

TreeSet不支援快速随機周遊,隻能通過疊代器進行周遊!

TreeSet周遊測試程式如下:

Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例
Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例
Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例

運作結果:

Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例
Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例

下面通過執行個體學習如何使用TreeSet

Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例
Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例
Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例

運作結果: 

Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例
Java 集合系列17之 TreeSet詳細介紹(源碼解析)和使用示例