国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java 數據結構】TreeMap和TreeSet的介紹

這篇具有很好參考價值的文章主要介紹了【Java 數據結構】TreeMap和TreeSet的介紹。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

java中的treeset和treemap,Java數據結構,數據結構,TreeMap,TreeSet


目錄

1、認識 TreeMap 和 TreeSet

2、TreeMap 的主要成員變量

3、TreeMap 的主要構造方法

4、TreeMap 和 TreeSet 的元素必須可比較

5、TreeMap 和 TreeSet 關于 key 有序?

6、TreeMap 和 TreeSet 的關系?

7、總結


1、認識 TreeMap 和 TreeSet

TreeMap 和 TreeSet 是Java中利用搜索樹實現的 Map 和 Set,它們的底層是紅黑樹,而紅黑樹是一棵近似平衡的二叉搜索樹,關于紅黑樹相關知識后續(xù)講解。本期主要是學會 TreeMap 和 TreeSet 的使用,以及知道他們的特點即可。

java中的treeset和treemap,Java數據結構,數據結構,TreeMap,TreeSet


2、TreeMap 的主要成員變量

// 存儲傳入比較器的引用
private final Comparator<? super K> comparator;

// 搜索樹的根節(jié)點
private transient Entry<K,V> root;

// 節(jié)點個數
private transient int size = 0;

// 統(tǒng)計搜索樹結構修改的次數
private transient int modCount = 0;

這里我們需要注意的是 comparator 這個引用,它是用來接收一個比較器的,主要功能后續(xù)會講解,這里注意一下即可。


3、TreeMap 的主要構造方法

public TreeMap() {
    comparator = null;
}

public TreeMap(Comparator<? super K> comparator) {
    this.comparator = comparator;
}

public TreeMap(Map<? extends K, ? extends V> m) {
    comparator = null;
    putAll(m);
}
  • 第一個構造方法,沒什么意外的,你沒傳比較器嘛,自然就是 null。
  • 第二個是傳了比較器的構造方法, 指定了比較器也很簡單。
  • 第三個構造方法, 則是把你傳遞的 Map?構造一個新的樹映射,包含與給定映射相同的映射,并根據其 key 的自然順序進行排序,這些 key,必須可相互比較!

4、TreeMap 和 TreeSet 的元素必須可比較

因為 TreeMap 和 TreeSet 實現了 SortedSet 接口,表示是一個需要實現排序功能的 Map 或 Set,那實現排序的前提,你放入的元素必須是可比較的,那么也就是說,當你往 TreeMap 里面放 key 的時候,這個 key 必須可比較,也就是重寫了 compaerTo?方法,你也可也直接傳一個比較器也是可以的。

public class Test {
    public static void main(String[] args) {
        Map<Person, Integer> map = new TreeMap<>();
        System.out.println(map);
    }
}

java中的treeset和treemap,Java數據結構,數據結構,TreeMap,TreeSet

這個報錯就是在說,?Person 無法被轉換成 Comparable,也就是在 TreeMap 底層實現中無法將 key 對象中的 compareTo 方法。

具體我們還是要去看 TreeMap 的無參構造方法以及 put 的源碼:

public TreeMap() {
    comparator = null;
}

對于 TreeMap 的無參構造方法,其實很簡單,如果你沒有傳比較器進去,默認就是 null 的,接下來就得看一下 put 方法了。

源碼中比較多,我們這里只截取一小部分,能明白為啥重寫 compareTo 方法即可。

java中的treeset和treemap,Java數據結構,數據結構,TreeMap,TreeSet

很明顯,我們是第一次 put 元素,所以搜索樹的根節(jié)點也就是 root 節(jié)點為 null,接著將我們 put 進去的 key 作為 compare 兩個參數傳遞進去,接著去看 compare 的實現:

java中的treeset和treemap,Java數據結構,數據結構,TreeMap,TreeSet這里我們沒有傳比較器,所以剛開始的無參構造方法已經將 comparator 置 null了,很明顯這里可以發(fā)現,如果我們傳了比較器,就按照比較器的方式來比較,如果沒有比較器,則會將 key 轉換成 Comparable<Person>,這個尖括號中的類型,?此時我們這里是轉換成 Person,這也是泛型上界的相關知識,所以即最終調用了我們 key 對象中的 compareTo 方法,那如果我們沒有實現 Comparable 這個接口,也沒有重寫 compareTo 方法自然會拋異常。

當然后續(xù) put 元素也是按照上面的方法來比較的,有比較器,使用比較器來比較,無比較器,調用對象中的 compareTo 進行比較。


5、TreeMap 和 TreeSet 關于 key 有序?

我們前面講到過, TreeMap 和 TreeSet 的底層其實是搜索樹,而且是紅黑樹,那么中序遍歷搜索樹是有序的,也即按照 key 提供的比較方式,或者你自己提供的比較器,關于 key 是有序的。

class Person implements Comparable<Person> {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Person o) {
        return this.age - o.age;
    }
}

public class Test {
    public static void main(String[] args) {
        TreeMap<Person, Integer> map = new TreeMap<>();
        map.put(new Person("張三", 12), 1);
        map.put(new Person("李四", 21), 2);
        map.put(new Person("王五", 16), 3);
        Set<Map.Entry<Person, Integer>> entrySet = map.entrySet();
        for (Map.Entry<Person, Integer> personIntegerEntry : entrySet) {
            System.out.println(personIntegerEntry);
        }
    }
}

由于 Map 沒有繼承于Iterable 接口,所以不能采用 for-each 遍歷,只能返回 Key-value 的映射關系放入 Set 中進行遍歷。

上述代碼是按照 Person 中的年齡進行比較的,所以如果最終打印出來的結果是 12 21 16 這樣的年齡排序的順序話,也足以說明,在 TreeMap 和 TreeSet 中是關于 key 有序的,打印結果:

java中的treeset和treemap,Java數據結構,數據結構,TreeMap,TreeSet

看到這,可能有的小伙伴說,確實是關于 key 有序,但是怎么保證底層是一棵搜索樹呢?其實也很簡單驗證,搜索樹前幾期也講過,如果是按照我們 Person 類比較的方式的話,那么根節(jié)點的左邊都小于它,根節(jié)點的右邊都大于它,這里我們通過調試看看 map 中存儲的結構就ok了:

java中的treeset和treemap,Java數據結構,數據結構,TreeMap,TreeSet這里我們通過調試的方式進入到源碼中,輸入我們想觀察的變量,于是可以看到,確實是一棵搜索樹,而且不是簡單的二叉搜索樹,是一棵紅黑樹。

為什么是這里就能看出來是紅黑樹呢,因為如果是按照我們前面講二叉搜索樹的邏輯,?根節(jié)點一定是第一次插入的 “張三,12”,而這里跟節(jié)點為什么是 “王五,16”,因為當插入 “王五” 的時候,搜索樹的左右子樹高度不平衡了,紅黑樹進行了旋轉調整,至于更多底層實現細節(jié),目前我們可以不用關心,由此也可能看出來并不是一棵簡單的二叉搜索樹。


6、TreeMap 和 TreeSet 的關系?

上期其實也提到過,Set 的底層其實就是 Map,而 TreeSet 也是一樣,底層仍然是 TreeMap,拿什么證明呢?其實我們來看 Set 的構造方法就可以了:

TreeSet(NavigableMap<E,Object> m) {
    this.m = m;
}

public TreeSet() {
    this(new TreeMap<E,Object>());
}

public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}

public TreeSet(Collection<? extends E> c) {
    this();
    addAll(c);
}

這里的 NavigableMap 也是一個繼承 SortedMap 的接口,因此具有SortedMap,Map接口的屬性方法,通過上述的構造方法也能看出,當你實例化一個 TreeSet 對象的時候,本質上還是 new 了一個 TreeMap 對象。而能明顯看到,value 為一個 Object 默認對象。


7、總結

TreeMap 和 TreeSet 底層都是紅黑樹,插入刪除查找的時間復雜度為 O(logN),數據關于 key 是有序的,key 必須要能夠比較,不然會拋出 ClassCastException 異常,主要運用于需要 key 有序的場景下,TreeMap 和 TreeSet 是線程不安全的。?


下期預告:【Java 數據結構】HashMap和HashSet文章來源地址http://www.zghlxwxcb.cn/news/detail-808213.html

到了這里,關于【Java 數據結構】TreeMap和TreeSet的介紹的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Java中TreeSet的基本介紹,細節(jié)討論,使用注意事項,常用方法,底層源碼分析

    TreeSet 是 Java 中的一個有序集合實現,它基于紅黑樹數據結構來存儲元素, 可以保持元素的自然順序(默認情況下升序)或者根據自定義比較器來進行排序 。下面是關于 TreeSet 的基本介紹、細節(jié)討論、使用注意事項、常用方法以及一些底層實現細節(jié)。 基本介紹: TreeSet 是

    2024年02月11日
    瀏覽(35)
  • Java數據結構學習和源碼閱讀(線性數據結構)

    Java數據結構學習和源碼閱讀(線性數據結構)

    鏈表的數據結構 一組由節(jié)點組成的數據結構,每個元素指向下一個元素,是線性序列。 最簡單的鏈表結構: 數據 指針(存放執(zhí)行下一個節(jié)點的指針) 不適合的場景: 需要循環(huán)遍歷將導致時間復雜度的提升 鏈表分類—單向鏈表 鏈表結構: 數據 指針 Next(指向下一個節(jié)點)

    2024年02月12日
    瀏覽(24)
  • Java 數據結構集合

    Java 數據結構集合

    詳細請轉到@pdai的博客 1.1 數組 (Array) 數組的優(yōu)點: 存取速度快 數組的缺點: 事先必須知道數組的長度 插入刪除元素很慢 空間通常是有限制的 需要大塊連續(xù)的內存塊 插入刪除元素的效率很低 源碼分析: 1、底層數據結構是Object 2、構造函數包括無參構造和有參數構造,有參構

    2024年01月24日
    瀏覽(20)
  • 數據結構---數組(java)

    1 、數組基礎 1 用來存儲一組類型相同的數據 2 在內存中,分配連續(xù)的空間,數組創(chuàng)建時要指定容量(大?。?3 數據類型[] 數組名 int[] arr = new int[10] int[] arr2 = {1,2,3,4} 4 索引---訪問數組時通過索引進行操作 5 索引從0開始,最大為 arr.length -1 6 常見的錯誤: NullPointException ArrayI

    2024年01月23日
    瀏覽(20)
  • 數據結構——鏈表(java)

    數據結構——鏈表(java)

    1.1 定義 鏈表是一種物理存儲結構上非連續(xù)存儲結構,數據元素的邏輯順序是通過鏈表中的引用鏈接次序實現的。 如圖所示: 1.2 鏈表分類 單向、雙向;帶頭、不帶頭;循環(huán)、非循環(huán) 重點 :單向不帶頭非循環(huán)、雙向不帶頭非循環(huán)(集合類底層) 如圖:單項帶頭非循環(huán)鏈表結

    2024年02月09日
    瀏覽(17)
  • Java基礎--數據結構

    Java基礎--數據結構

    Java工具包提供了強大的數據結構。在Java中的數據結構主要包括以下幾種接口和類: 枚舉(Enumeration)、位集合(BitSet)、向量(Vector)、棧(Stack)、字典(Dictionary)、哈希表(Hashtable)、屬性(Properties) 以上這些類是傳統(tǒng)遺留的,在Java2中引入了一種新的框架-集合框架

    2023年04月14日
    瀏覽(30)
  • Java 數據結構

    Java 數據結構 Java 提供了豐富的數據結構來處理和組織數據。 Java 的 java.util 包中提供了許多這些數據結構的實現,可以根據需要選擇合適的類。 以下是一些常見的 Java 數據結構: 數組(Arrays) 數組(Arrays)是一種基本的數據結構,可以存儲固定大小的相同類型的元素。 i

    2024年02月22日
    瀏覽(13)
  • Java數據結構

    Java數據結構

    java數據結構有: 1、數組? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2、列表? (List) 3、集合(Set)???????????????????4、棧 (Stack)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 5、隊列? (Queue)? ? ? ? ? ? ? ? 6、樹 (Tree)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 7、堆 (Heap)? ? ? ?

    2024年02月08日
    瀏覽(17)
  • java 數據結構- 圖

    表示多對多的關系時,這里我們就用到了圖 圖的常用概念 頂點 邊 路徑 無向圖 有向圖 帶權圖(邊帶權值的圖也叫做網) 圖的表示方式有兩種:二維數組表示(鄰接矩陣);鏈表表示(鄰接表) 鄰接矩陣 鄰接矩陣是表示圖形中頂點之間相鄰關系的矩陣,對于n個頂點的圖而

    2024年02月14日
    瀏覽(15)
  • [JAVA數據結構]HashMap

    [JAVA數據結構]HashMap

    目錄 1.HashMap 1.1Map的常用方法 1.2HashMap的使用案例 基于哈希表的實現的Map接口。 Map底層結構 HashMap 底層結構 哈希桶 插入/刪除/查找時間復雜度 O(1) 是否有序 無序 線程安全 不安全 插入/刪除/查找區(qū)別 通過哈希函數計算哈希地址 比較與覆寫 自定義類型需要覆寫equals和 hashCod

    2024年02月12日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包