淺談TreeMap以及在java中的使用
阿新 • • 發佈:2018-07-11
copy ber clone 以及 復制 鍵值對 println 二叉樹 extends
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>(newxbComparator()); 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遍歷鍵值對
?123456789 | 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越大時,遍歷的效率差別就越大。
淺談TreeMap以及在java中的使用