TreeMap解析

2019/08/17 Java 集合

在Map集合框架中,除了 HashMap 以外,TreeMap 也是我们工作中常用到的集合对象之一。

与 HashMap 相比,TreeMap 是一个能比较元素大小的 Map 集合,会对传入的 key 进行了大小排序。其中,可以使用元素的自然顺序,也可以使用集合中自定义的比较器来进行排序;

不同于 HashMap 的哈希映射,TreeMa 底层实现了树形结构,至于具体形态,你可以简单的理解为一颗倒过来的树—根在上叶在下。如果用计算机术语来说的话,TreeMap实现了红黑树的结构,形成了一颗二叉树


概述

TreeMap的Key按照自然顺序进行排序或者根据创建映射时提供的Comparator接口进行排序。

TreeMap为增、删、改、查这些操作提供了log(N)的时间开销,从存储角度而言,这比HashMap与LinkedHashMap的O(1)时间复杂度要差些。

但是在统计性能上,TreeMap同样可以保证log(N)的时间开销,这又比HashMap与LinkedHashMap的O(N)时间复杂度好不少。

类的继承图:

TreeMap类的继承图

  • Comparator<? super K> comparator: 比较器对象
  • Entry<K,V> root: 根节点
  • int size = 0:容器长度
  • int modCount = 0:结构性修改次数
  • EntrySet entrySet: 存储KV对,无顺序
  • KeySet navigableKeySet:存储K
  • NavigableMap<K,V> descendingMap: 有顺序的存储。

构造函数

  • TreeMap()
  • TreeMap(Comparator<? super K> comparator)
  • TreeMap(Map<? extends K, ? extends V> m)
  • TreeMap(SortedMap<K, ? extends V> m)
  • 创建 TreeMap 对象,如果没有指定比较器,那么就是用自然排序。

成员方法

put

  • 按照 comparator 对 key 进行排序,然后放到红黑二叉树指定的位置。
  • key 不允许为 null, value 可以为空。
  • oldValue 如果存在的话,会被替换;如果不存在的话,则新添一个节点,然后对做红黑树的平衡操作。

get

  • 按照 comparator 对 key 进行排序,获取key的位置, 迭代红黑二叉树,取到节点对象。
  • 时间复杂度是log(n)。

remove

  • 先找到节点对象,删除,然后平衡红黑树。

总结

  • 构造方法中传递了 Comparator 对象,那么就会以 Comparator 对象的方法进行比较。否则,则使用 Comparator 的compareTo(T o)方法来比较。
  • key 不允许为 null。
  • 如果只需要存储功能,使用HashMap与LinkedHashMap是一种更好的选择;如果需要保证统计性能或者需要对 key 按照一定规则进行排序,那么使用 TreeMap 是一种更好的选择。

Search

    Table of Contents