TreeSet詳解


TreeSet是Set的子類,TreeSet和Set都是java.util 下的,使用時需要導入java.util包。

Set是collection的子類,collection不能實例化,但是它的子類可以,其關系圖為:

 

 

 

現在開始對TreeSet進行分析

使用TreeSet集合的類需要導入一下兩個包

import java.util.Set;

import java.util.TreeSet;

 

TreeSet底層是二叉樹,可以對對象元素進行排序,但是自定義類需要實現comparable接口,重寫comparaTo() 方法。

TreeSet 可以保存對象元素的唯一性(並不是一定保證唯一性,需要根據重寫的compaaTo方法來確定)

 

 

1 如圖,TreeSet存放簡單的同一類型的數據。

 

 

 

“a” “1” “c” “f”   全部都為String字符串,輸出結果如上圖。

但是如果TreeSet保存的數據類型不同時,輸出結果又如何

 

“a” “1” “f”  為String類型,1為int類型,兩種類型不同,執行程序時報java.lang.ClassCastExection異常。

 

 

2 上面是TreeSet存放簡單類型,如果TreeSet存放對象呢?

創建一個自定義類,里面包含幾個屬性。上面說過,對象元素進行排序,但是自定義類需要實現comparable接口,重寫comparaTo() 方法。

2.1 我們先測試一下沒有實現comparable接口,重寫compareTo()方法時的現象。

 

 

 

 

 

如圖,如果自定義類沒有實現comparable接口,重寫comparaTo()方法,會報java.lang.ClassCastException: person cannot be cast to java.lang.Comparable,java.lang.Comparable說明自定義類需要實現comparable接口,重寫comparaTo()方法。

 

2.2 我們再來測試一下實現comparable接口,重寫compareTo()方法時的現象。

 

 

 

 

 

現在你會發現,執行程序雖然沒有報錯,但是明明add了三個對象,結果只輸出了一個對象的值。原來,TreeSet的排列順序與重寫的compareTo()方法的返回值有關。

return 0:元素每次進行比較,都認為是相同的元素,這是就不再向TreeSet里面插入除第一個元素以外的元素,所以TreeSet中就只插入了一個元素。

return 1:元素每次進行比較,都認為新插入的元素比上一個元素大,於是二叉樹存儲時,會儲存在根的右側,讀取時就是正序排列,先進先出。

return -1:元素每次進行比較,都認為新插入的元素比上一個元素小,於是二叉樹存儲時,會儲存在根的左側,讀取時就是倒序排列,先進后出。

如圖:

 

 

 

 

 

 

 

 

 

 

上面說過 保存對象元素的唯一性(並不是一定保證唯一性,需要根據重寫的compaaTo方法來確定),下面來實驗一下:

 

 

 

Add兩個p3,輸出的時候也輸出了兩個p3對象,這時就沒有保證對象的唯一性。

 

3 根據重寫的compaaTo方法來確定保存對象元素的唯一性。

3.1 根據上述規則,我們可以自定義根據對象的某個屬性進行比較。

下面我們根據id進行比較

 

 

 

 

 

3.2 根據name(根據unicode大小)進行比較

 

 

 

 

 

根據3.1 3.2 可以看出,當根據對象的某一個屬性進行排序時,可以確保唯一性。

 

以上是對TreeSet的測試理解,其中還有許多不理解的地方,例如compareTo()方法內部如何實現排序的,等理解后再來完善文檔。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM