1. TreeMap集合介绍
TreeMap是一个有序的key-value集合,它是通过红黑树实现的。
可排序是TreeMap集合的最重要特点,其映射根据键的自然顺序进行排序,或者根据创建映射时提供的Comparator比较器进行排序。
2. TreeMap数据结构
public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable
static final class Entry<K,V> implements Map.Entry<K,V> { K key; V value; Entry<K,V> left; Entry<K,V> right; Entry<K,V> parent; boolean color = BLACK; }
TreeMap继承AbstractMap,并且实现了NavigableMap接口。
TreeMap的本质是红黑树,包含几个重要的成员变量:root,size,comparator。
root是红黑树的根节点,是一个Entry类型。Entry是红黑树的节点,包含红黑树的6个基本组成部分:key,value,left(左孩子),right(右孩子),parent(父节点),color(颜色)。Entry节点根据key进行排序,Entry节点包含的内容为value。Entry中的key比较大小是根据比较器comparator来判断的。
3. TreeMap源码解析
//无参构造方法,默认比较机制 public TreeMap() { comparator = null; } //自定义比较器的构造方法 public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; } //构造已知Map对象的TreeMap public TreeMap(Map<? extends K, ? extends V> m) { comparator = null; //默认比较机制 putAll(m); } //构造已知的SortedMap对象为TreeMap public TreeMap(SortedMap<K, ? extends V> m) { comparator = m.comparator(); //使用已知对象的构造器 try { buildFromSorted(m.size(), m.entrySet().iterator(), null, null); } catch (java.io.IOException | ClassNotFoundException cannotHappen) { } }
4. TreeMap实例
public class TreeMapTest { public static void main(String[] args) { Random r = new Random(); TreeMap<String,Integer> treeMap = new TreeMap<>(); treeMap.put("one",r.nextInt(10)); treeMap.put("two",r.nextInt(10)); treeMap.put("three",r.nextInt(10)); System.out.println(treeMap); System.out.println("通过keySet遍历"); Set<String> set = treeMap.keySet(); Iterator<String> it = set.iterator(); while (it.hasNext()){ String key = it.next(); Integer value = treeMap.get(key); System.out.println(key + "=" + value); } for(String s : set){ System.out.println(s + "=" + treeMap.get(s)); } System.out.println("通过entrySet遍历"); Set<Map.Entry<String,Integer>> set1 = treeMap.entrySet(); Iterator<Map.Entry<String,Integer>> it1 = set1.iterator(); while (it1.hasNext()){ Map.Entry<String,Integer> map = it1.next(); String key = map.getKey(); Integer value = map.getValue(); System.out.println(key + "=" + value); } for(Map.Entry<String,Integer> mm : set1){ System.out.println(mm.getKey() + "=" + mm.getValue()); } System.out.println(treeMap.size()); System.out.println(treeMap.containsKey("one")); System.out.println(treeMap.containsValue(0)); System.out.println(treeMap.remove("three")); System.out.println(treeMap); treeMap.clear(); System.out.println(treeMap.isEmpty()); } }