码迷,mamicode.com
首页 > 其他好文 > 详细

TreeMap解析

时间:2016-01-01 14:58:25      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

  TreeMap基于红黑树的NavigableMap实现。相对于HashMap来说,TreeMap多继承一个NavigableMap接口,因此HashMap的key是无序的,TreeMap的key是有序的,其是根据key的自然顺序或在创建时提供的Comparator来存储元素。TreeMap是非同步的,它返回的迭代器是快速失败的。

  Comparable和Comparator的区别:Comparable是排序接口,如果一个类实现了Comparable接口,则意味着该类支持排序;Comparator是比较器接口,当需要控制某个类的次序,而该类本身并不支持排序,那么可以建立一个该类的比较器来进行排序;Comparable相当于内部比较器,而Comparator相当于外部比较器。

  TreeMap的源码解析

  TreeMap的继承关系

public class TreeMap<K,V>
    extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable

  TreeMap本质是一棵红黑树,关于红黑树的原理,参考

  TreeMap的构造函数

  1. 默认的构造函数,使用key的自然顺序来进行排序

public TreeMap() {
  comparator
= null; }

  2. 使用带比较器的构造函数

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

  3. 带有Map的构造函数,参数Map成为TreeMap的子集。Map中的key必须实现Comparable接口,插入后的顺序是按照key的自然顺序来排序的

public TreeMap(Map<? extends K, ? extends V> m) {
  comparator = null;
  putAll(m);
}

   该构造函数会调用putAll方法将参数Map中的所有元素添加到TreeMap中,putAll的源码如下:

public void putAll(Map<? extends K, ? extends V> map) {
  int mapSize = map.size();
  if (size==0 && mapSize!=0 && map instanceof SortedMap) {
    Comparator<?> c = ((SortedMap<?,?>)map).comparator();
       if (c == comparator || (c != null && c.equals(comparator))) {
         ++modCount;
      try {
        buildFromSorted(mapSize, map.entrySet().iterator(),
                             null, null);
      } catch (java.io.IOException cannotHappen) {  
      }
catch (ClassNotFoundException cannotHappen) {       }       return;     }   }   super.putAll(map); }

   可知其是通过buildFromSorted实现的,其源码如下:

// 根据已经一个排好序的map创建一个TreeMap
// 将map中的元素逐个添加到TreeMap中,并返回map的中间元素作为根节点
private final Entry<K,V> buildFromSorted(int level, int lo, int hi,
                                             int redLevel,
                                             Iterator<?> it,
                                             java.io.ObjectInputStream str,
                                             V defaultVal)
        throws  java.io.IOException, ClassNotFoundException {


  if (hi < lo) return null;
  // 获取中间元素
  int mid = (lo + hi) >>> 1;

  Entry<K,V> left  = null;
  // 若lo小于mid,则递归调用获取(middel的)左孩子。
  if (lo < mid)
    left = buildFromSorted(level+1, lo, mid - 1, redLevel, it, str, defaultVal);

  // 获取middle节点对应的key和value   K key;   V value;   if (it != null) {     if (defaultVal == null) {       Map.Entry<?,?> entry = (Map.Entry<?,?>)it.next();       key = (K)entry.getKey();       value = (V)entry.getValue();     } else {       key = (K)it.next();       value = defaultVal;     }   } else { // use stream     key = (K) str.readObject();     value = (defaultVal != null ? defaultVal : (V) str.readObject());   }   // 创建middle节点   Entry<K,V> middle = new Entry<>(key, value, null);   // 若当前节点的深度=红色节点的深度,则将节点着色为红色。   if (level == redLevel)     middle.color = RED;   // 设置middle为left的父亲,left为middle的左孩子   if (left != null) {     middle.left = left;     left.parent = middle;   }   // 递归调用获取(middel的)右孩子   if (mid < hi) {     Entry<K,V> right = buildFromSorted(level+1, mid+1, hi, redLevel, it, str, defaultVal);     // 设置middle为left的父亲,left为middle的左孩子     middle.right = right;     right.parent = middle;   }   return middle; }

  4. 带有SortedMap的构造函数。此构造函数参数是一个有序的Map

public TreeMap(SortedMap<K, ? extends V> m) {
  comparator = m.comparator();
  try {
    buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
  } catch (java.io.IOException cannotHappen) {
  } catch (ClassNotFoundException cannotHappen) {
  }
}

 

 

  

TreeMap解析

标签:

原文地址:http://www.cnblogs.com/tianex/p/5093227.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!