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()方法內部如何實現排序的,等理解后再來完善文檔。