淺談TreeMap以及在java中的使用


本文為博主原創文章,轉載請附帶博客地址:https://www.cnblogs.com/xbjhs/p/8280714.html

treemap結構是紅黑樹

   1.先介紹一下平衡二叉樹

     其特點是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。也就是說該二叉樹的任何一個子節點,其左右子樹的高度都相近。

   2.紅黑樹(Red Black Tree) 是一種自平衡二叉查找樹

   (1)檢索效率O(log n)

(2)紅黑樹的五點規定:
 a每個節點都只能是紅色或者黑色
 b根節點是黑色
 c每個葉節點(NIL節點,空節點)是黑色的。
 d從每個葉子到根的所有路徑上不能有兩個連續的紅色節點。
 e從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

   3.java中的定義:public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable

treeMap繼承AbstractMap,實現NavigableMap、Cloneable、Serializable三個接口。而AbstractMap表明TreeMap為一個Map即支持key-value的集合。
4.java中的應用
(1)TreeMap的基本操作 containsKey、get、put 和 remove 的時間復雜度是 log(n) ,TreeMap是非同步的
(2)TreeMap中默認的排序為升序,如果要改變其排序可以自己寫一個Comparator
eg:
 1 import java.util.Comparator;
 2 import java.util.Iterator;
 3 import java.util.Set;
 4 import java.util.TreeMap;
 5 
 6 
 7 public class Compare {
 8     public static void main(String[] args) {
 9         TreeMap<String,Integer> map = new TreeMap<String,Integer>(new xbComparator());
10         map.put("key_1", 1);
11         map.put("key_2", 2);
12         map.put("key_3", 3);   
13         Set<String> keys = map.keySet();
14         Iterator<String> iter = keys.iterator();
15         while(iter.hasNext())
16         {
17                 String key = iter.next();
18                 System.out.println(" "+key+":"+map.get(key));
19         }
20     }
21 }
22 class xbComparator implements Comparator
23 {
24     public int compare(Object o1,Object o2)
25     {
26         String i1=(String)o1;
27         String i2=(String)o2;
28         return -i1.compareTo(i2);
29     }
30 }
 
        

(3)Tree的遍歷
a遍歷鍵值對
Integer value = null;  
Iterator iter = map.entrySet().iterator();  
while(iter.hasNext()) {  
    Map.Entry entry = (Map.Entry)iter.next();  
    // 獲取key  
    key = (String)entry.getKey();  
        // 獲取value  
    value = (Integer)entry.getValue();  
}  
b遍歷鍵
String key = null;  
Integer value= null;  
Iterator iter = map.keySet().iterator();  
while (iter.hasNext()) {  
        // 獲取key  
    key = (String)iter.next();  
        // 根據key,獲取value  
    value= (Integer)map.get(key);  
}  
 
        

c遍歷value

Integer value = null;  
Collection c = map.values();  
Iterator iter= c.iterator();  
while (iter.hasNext()) {  
    value = (Integer)iter.next();  
}  

:使用entrySet遍歷方式要比keySet遍歷方式快

entrySet遍歷方式獲取Value對象是直接從Entry對象中直接獲得,時間復雜度T(n)=o(1);
keySet遍歷獲取Value對象則要從Map中重新獲取,時間復雜度T(n)=o(n);keySet遍歷Map方式比entrySet遍歷Map方式多了一次循環,多遍歷了一次table,當Map的size越大時,遍歷的效率差別就越大。





















 

 


免責聲明!

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



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