新聞中心
Java TreeSet 是 Java 集合框架中的一種數(shù)據(jù)結(jié)構(gòu),它實(shí)現(xiàn)了 Set 接口和 SortedSet 接口,TreeSet 是基于紅黑樹(Red-Black Tree)實(shí)現(xiàn)的有序集合,可以保證元素的唯一性和排序性,本文將詳細(xì)介紹 Java TreeSet 的原理、特點(diǎn)以及使用方法。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:做網(wǎng)站、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的龍泉網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
原理
1、1 紅黑樹
紅黑樹是一種自平衡的二叉查找樹,它的每個(gè)節(jié)點(diǎn)都有一個(gè)顏色屬性(紅色或黑色),紅黑樹具有以下性質(zhì):
每個(gè)節(jié)點(diǎn)要么是紅色,要么是黑色。
根節(jié)點(diǎn)是黑色的。
每個(gè)葉子節(jié)點(diǎn)(NIL節(jié)點(diǎn),空節(jié)點(diǎn))是黑色的。
如果一個(gè)節(jié)點(diǎn)是紅色的,則它的兩個(gè)子節(jié)點(diǎn)都是黑色的。
對(duì)于每個(gè)節(jié)點(diǎn),從該節(jié)點(diǎn)到其所有后代葉子節(jié)點(diǎn)的簡單路徑上,均包含相同數(shù)目的黑色節(jié)點(diǎn)。
1、2 TreeSet 的實(shí)現(xiàn)
TreeSet 是基于紅黑樹實(shí)現(xiàn)的有序集合,它的內(nèi)部結(jié)構(gòu)是一個(gè)紅黑樹,TreeSet 的主要操作包括添加元素、刪除元素、查找元素、遍歷元素等,這些操作的時(shí)間復(fù)雜度都是 O(log n),n 是 TreeSet 中元素的個(gè)數(shù)。
特點(diǎn)
2、1 有序性
TreeSet 中的元素是按照自然順序或者自定義比較器進(jìn)行排序的,如果使用自然順序排序,那么元素的類型需要實(shí)現(xiàn) Comparable 接口;如果使用自定義比較器排序,那么元素的類型需要實(shí)現(xiàn) Comparator 接口。
2、2 唯一性
TreeSet 不允許存儲(chǔ)重復(fù)的元素,當(dāng)向 TreeSet 中添加重復(fù)元素時(shí),新元素會(huì)替換掉原有的重復(fù)元素。
2、3 線程安全性
TreeSet 不是線程安全的,如果需要在多線程環(huán)境下使用 TreeSet,可以使用 Collections.synchronizedSortedSet() 方法將其轉(zhuǎn)換為同步的有序集合。
使用方法
3、1 創(chuàng)建 TreeSet
創(chuàng)建 TreeSet 有兩種方法:一種是創(chuàng)建一個(gè)空的 TreeSet,另一種是創(chuàng)建一個(gè)包含初始元素的 TreeSet,以下是兩種創(chuàng)建 TreeSet 的方法:
// 創(chuàng)建一個(gè)空的 TreeSet TreeSettreeSet = new TreeSet<>(); // 創(chuàng)建一個(gè)包含初始元素的 TreeSet TreeSet treeSetWithElements = new TreeSet<>(Arrays.asList("A", "B", "C"));
3、2 添加元素
向 TreeSet 中添加元素有兩種方法:一種是 add() 方法,另一種是 put() 方法,add() 方法只有在集合中不存在相同元素時(shí)才會(huì)添加成功;put() 方法無論集合中是否存在相同元素,都會(huì)添加成功并返回之前的元素(如果有的話),以下是兩種添加元素的方法:
treeSet.add("D"); // 添加成功,因?yàn)榧现胁淮嬖?"D" 這個(gè)元素
treeSet.add("A"); // 添加失敗,因?yàn)榧现幸呀?jīng)存在 "A" 這個(gè)元素
treeSet.put("E"); // 添加成功,并返回之前的元素(如果有的話),這里沒有之前的元素,所以返回 null
3、3 刪除元素
從 TreeSet 中刪除元素有兩種方法:一種是 remove() 方法,另一種是 poll() 方法,remove() 方法會(huì)刪除指定元素并返回 true;poll() 方法會(huì)刪除并返回指定元素的第一個(gè)匹配項(xiàng),如果沒有找到匹配項(xiàng)則返回 null,以下是兩種刪除元素的方法:
treeSet.remove("A"); // 刪除成功,并返回 true
treeSet.poll("B"); // 刪除成功,并返回 "B" 這個(gè)元素,如果沒有找到匹配項(xiàng)則返回 null
3、4 查找元素
在 TreeSet 中查找元素有兩種方法:一種是 contains() 方法,另一種是 floor() 方法,contains() 方法用于判斷集合中是否包含指定元素;floor() 方法用于查找指定元素的最小值(或下界),如果集合中不存在該元素,則返回 null,以下是兩種查找元素的方法:
boolean containsA = treeSet.contains("A"); // true,因?yàn)榧现邪?"A" 這個(gè)元素
String floorB = treeSet.floor("B"); // "B",因?yàn)榧现写嬖?"B" 這個(gè)元素的最小值(或下界)
相關(guān)問題與解答
Q1:TreeSet 是否支持并發(fā)訪問?
A1:TreeSet 不是線程安全的,如果需要在多線程環(huán)境下使用 TreeSet,可以使用 Collections.synchronizedSortedSet() 方法將其轉(zhuǎn)換為同步的有序集合,這種方法只是對(duì)整個(gè)集合進(jìn)行了同步,而不是對(duì)每個(gè)單獨(dú)的操作進(jìn)行同步,在高并發(fā)場景下,建議使用其他線程安全的數(shù)據(jù)結(jié)構(gòu),如 ConcurrentSkipListMap。
Q2:如何獲取 TreeSet 的大???
A2:可以使用 size() 方法獲取 TreeSet 的大小。int size = treeSet.size();,需要注意的是,size() 方法的時(shí)間復(fù)雜度為 O(n),因此在性能敏感的場景下,不建議頻繁調(diào)用 size() 方法,可以通過迭代器或者其他方式間接獲取大小。
分享題目:javatreeset的原理是什么
瀏覽地址:http://fisionsoft.com.cn/article/cdgjpip.html


咨詢
建站咨詢
