Java TreeMap 介紹和使用__Java

來源:互聯網
上載者:User

  概要

這一章,我們對TreeMap進行學習。
我們先對TreeMap有個整體認識,然後再學習它的源碼,最後再通過執行個體來學會使用TreeMap。內容包括:
第1部分 TreeMap介紹
第2部分 TreeMap資料結構
第3部分 TreeMap遍曆方式

轉載請註明出處:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928

  第1部分 TreeMap介紹

TreeMap 簡介

TreeMap 是一個有序的key-value集合,它是通過紅/黑樹狀結構實現的。
TreeMap 繼承於AbstractMap,所以它是一個Map,即一個key-value集合。
TreeMap 實現了NavigableMap介面,意味著它支援一系列的導航方法。比如返回有序的key集合。
TreeMap 實現了Cloneable介面,意味著它能被複製
TreeMap 實現了java.io.Serializable介面,意味著它支援序列化

TreeMap基於紅/黑樹狀結構(Red-Black tree)實現。該映射根據其鍵的自然順序進行排序,或者根據建立映射時提供的 Comparator 進行排序,具體取決於使用的構造方法。
TreeMap的基本操作 containsKey、get、put 和 remove 的時間複雜度是 log(n) 。
另外,TreeMap是非同步的。 它的iterator 方法返回的迭代器是fail-fastl的。

 

TreeMap的建構函式

// 預設建構函式。使用該建構函式,TreeMap中的元素按照自然排序進行排列。TreeMap()// 建立的TreeMap包含MapTreeMap(Map<? extends K, ? extends V> copyFrom)// 指定Tree的比較子TreeMap(Comparator<? super K> comparator)// 建立的TreeSet包含copyFromTreeMap(SortedMap<K, ? extends V> copyFrom)

TreeMap的API

 Map.Entry<K,V>ceilingEntry(K key)           返回一個鍵-值對應關係,它與大於等於給定鍵的最小鍵關聯;如果不存在這樣的鍵,則返回 null。 KceilingKey(K key)           返回大於等於給定鍵的最小鍵;如果不存在這樣的鍵,則返回 null。 voidclear()           從此映射中移除所有映射關係。 Objectclone()           返回此 TreeMap 執行個體的淺表副本。 Comparator<? super K>comparator()           返回對此映射中的鍵進行排序的比較子;如果此映射使用鍵的自然順序,則返回 null。 booleancontainsKey(Object key)           如果此映射包含指定鍵的映射關係,則返回 true。 booleancontainsValue(Object value)           如果此映射為指定值對應一個或多個鍵,則返回 true。 NavigableSet<K>descendingKeySet()           返回此映射中所包含鍵的逆序 NavigableSet 視圖。 NavigableMap<K,V>descendingMap()           返回此映射中所包含映射關係的逆序視圖。 Set<Map.Entry<K,V>>entrySet()           返回此映射中包含的映射關係的 Set 視圖。 Map.Entry<K,V>firstEntry()           返回一個與此映射中的最小鍵關聯的鍵-值對應關係;如果映射為空白,則返回 null。 KfirstKey()           返回此映射中當前第一個(最低)鍵。 Map.Entry<K,V>floorEntry(K key)           返回一個鍵-值對應關係,它與小於等於給定鍵的最大鍵關聯;如果不存在這樣的鍵,則返回 null。 KfloorKey(K key)           返回小於等於給定鍵的最大鍵;如果不存在這樣的鍵,則返回 null。 Vget(Object key)           返回指定鍵所映射的值,如果對於該鍵而言,此映射不包含任何映射關係,則返回 null。 SortedMap<K,V>headMap(K toKey)           返回此映射的部分視圖,其索引值嚴格小於 toKey。 NavigableMap<K,V>headMap(K toKey, boolean inclusive)           返回此映射的部分視圖,其鍵小於(或等於,如果 inclusive 為 true)toKey。 Map.Entry<K,V>higherEntry(K key)           返回一個鍵-值對應關係,它與嚴格大於給定鍵的最小鍵關聯;如果不存在這樣的鍵,則返回 null。 KhigherKey(K key)           返回嚴格大於給定鍵的最小鍵;如果不存在這樣的鍵,則返回 null。 Set<K>keySet()           返回此映射包含的鍵的 Set 視圖。 Map.Entry<K,V>lastEntry()           返回與此映射中的最大鍵關聯的鍵-值對應關係;如果映射為空白,則返回 null。 KlastKey()           返回映射中當前最後一個(最高)鍵。 Map.Entry<K,V>lowerEntry(K key)           返回一個鍵-值對應關係,它與嚴格小於給定鍵的最大鍵關聯;如果不存在這樣的鍵,則返回 null。 KlowerKey(K key)           返回嚴格小於給定鍵的最大鍵;如果不存在這樣的鍵,則返回 null。 NavigableSet<K>navigableKeySet()           返回此映射中所包含鍵的 NavigableSet 視圖。 Map.Entry<K,V>pollFirstEntry()           移除並返回與此映射中的最小鍵關聯的鍵-值對應關係;如果映射為空白,則返回 null。 Map.Entry<K,V>pollLastEntry()           移除並返回與此映射中的最大鍵關聯的鍵-值對應關係;如果映射為空白,則返回 null。 Vput(K key, V value)           將指定值與此映射中的指定鍵進行關聯。 voidputAll(Map<? extends K,? extends V> map)           將指定映射中的所有映射關係複製到此映射中。 Vremove(Object key)           如果此 TreeMap 中存在該鍵的映射關係,則將其刪除。 intsize()           返回此映射中的鍵-值對應關係數。 NavigableMap<K,V>subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)           返回此映射的部分視圖,其鍵的範圍從 fromKey 到 toKey。 SortedMap<K,V>subMap(K fromKey, K toKey)           返回此映射的部分視圖,其索引值的範圍從 fromKey(包括)到 toKey(不包括)。 SortedMap<K,V>tailMap(K fromKey)           返回此映射的部分視圖,其鍵大於等於 fromKey。 NavigableMap<K,V>tailMap(K fromKey, boolean inclusive)           返回此映射的部分視圖,其鍵大於(或等於,如果 inclusive 為 true)fromKey。 Collection<V>values()           返回此映射包含的值的 Collection 視圖。


第2部分 TreeMap資料結構

TreeMap的繼承關係

java.lang.Object   ↳     java.util.AbstractMap<K, V>         ↳     java.util.TreeMap<K, V>public class TreeMap<K,V>    extends AbstractMap<K,V>    implements NavigableMap<K,V>, Cloneable, java.io.Serializable {}

TreeMap與Map關係如下圖:

從圖中可以看出:
(01) TreeMap實現繼承於AbstractMap,並且實現了NavigableMap介面。
(02) TreeMap的本質是R-B Tree(紅/黑樹狀結構),它包含幾個重要的成員變數: root, size, comparator。
  root 是紅黑數的根節點。它是Entry類型,Entry是紅黑數的節點,它包含了紅黑數的6個基本組成成分:key(鍵)、value(值)、left(左孩子)、right(右孩子)、parent(父節點)、color(顏色)。Entry節點根據key進行排序,Entry節點包含的內容為value。 
  紅黑數排序時,根據Entry中的key進行排序;Entry中的key比較大小是根據比較子comparator來進行判斷的。
  size是紅黑數中節點的個數。

關於紅黑數的具體演算法,請參考"紅/黑樹狀結構(一) 原理和演算法詳細介紹"。

第3部分 TreeMap遍曆方式

3.1 遍曆TreeMap的索引值對

第一步:根據entrySet()擷取TreeMap的“索引值對”的Set集合。
第二步:通過Iterator迭代器遍曆“第一步”得到的集合。

// 假設map是TreeMap對象// map中的key是String類型,value是Integer類型Integer integ = null;Iterator iter = map.entrySet().iterator();while(iter.hasNext()) {    Map.Entry entry = (Map.Entry)iter.next();    // 擷取key    key = (String)entry.getKey();        // 擷取value    integ = (Integer)entry.getValue();}

3.2 遍曆TreeMap的鍵

第一步:根據keySet()擷取TreeMap的“鍵”的Set集合。
第二步:通過Iterator迭代器遍曆“第一步”得到的集合。

// 假設map是TreeMap對象// map中的key是String類型,value是Integer類型String key = null;Integer integ = null;Iterator iter = map.keySet().iterator();while (iter.hasNext()) {        // 擷取key    key = (String)iter.next();        // 根據key,擷取value    integ = (Integer)map.get(key);}

3.3 遍曆TreeMap的值

第一步:根據value()擷取TreeMap的“值”的集合。
第二步:通過Iterator迭代器遍曆“第一步”得到的集合。

// 假設map是TreeMap對象// map中的key是String類型,value是Integer類型Integer value = null;Collection c = map.values();Iterator iter= c.iterator();while (iter.hasNext()) {    value = (Integer)iter.next();}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.