一.TreeMap的简介

TreeMap是一个有序的key-value集合,基于红黑树(Red-Black tree)的 NavigableMap实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序,具体取决于使用的构造方法。

下面简单介绍一下 红黑树:

  1. 根节点是黑色
  2. 每个节点都只能是红色或者黑色
  3. 每个叶节点(NIL节点,空节点)是黑色的。
  4. 如果一个节点是红色的,则它两个子节点都是黑色的,也就是说在一条路径上不能出现两个红色的节点。
  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

二.TreeMap的继承关系

  1. TreeMap<K,V>
  2. java.lang.Object
  3. 继承者 java.util.AbstractMap<K,V>
  4. 继承者 java.util.TreeMap<K,V>
  5. 类型参数:
  6. K - 此映射维护的键的类型
  7. V - 映射值的类型

继承AbstactMap类,则TreeMap是一个Map,具体key-value特性的集合!

实现了Navigable接口,意味着它支持一系列的导航方法,如有序的key返回。

实现了Cloneable接口,意味着它能被克隆。

实现了Serializable接口,意味着它支持序列化。

三.TreeMap的API

Tree API

1:构造方法

  1. TreeMap()
  2. 使用键的自然顺序构造一个新的、空的树映射。
  3. TreeMap(Comparator<? super K> comparator)
  4. 构造一个新的、空的树映射,该映射根据给定比较器进行排序。
  5. TreeMap(Map<? extends K,? extends V> m)
  6. 构造一个与给定映射具有相同映射关系的新的树映射,该映射根据其键的自然顺序 进行排序。
  7. TreeMap(SortedMap<K,? extends V> m)
  8. 构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射。

2:方法

  1. Map.Entry<K,V> ceilingEntry(K key)
  2. 返回一个键-值映射关系,它与大于等于给定键的最小键关联;如果不存在这样的键,则返回 null
  3. K ceilingKey(K key)
  4. 返回大于等于给定键的最小键;如果不存在这样的键,则返回 null
  5. void clear()
  6. 从此映射中移除所有映射关系。
  7. Object clone()
  8. 返回此 TreeMap 实例的浅表副本。
  9. Comparator<? super K> comparator()
  10. 返回对此映射中的键进行排序的比较器;如果此映射使用键的自然顺序,则返回 null
  11. boolean containsKey(Object key)
  12. 如果此映射包含指定键的映射关系,则返回 true
  13. boolean containsValue(Object value)
  14. 如果此映射为指定值映射一个或多个键,则返回 true
  15. NavigableSet<K> descendingKeySet()
  16. 返回此映射中所包含键的逆序 NavigableSet 视图。
  17. NavigableMap<K,V> descendingMap()
  18. 返回此映射中所包含映射关系的逆序视图。
  19. Set<Map.Entry<K,V>> entrySet()
  20. 返回此映射中包含的映射关系的 Set 视图。
  21. Map.Entry<K,V> firstEntry()
  22. 返回一个与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null
  23. K firstKey()
  24. 返回此映射中当前第一个(最低)键。
  25. Map.Entry<K,V> floorEntry(K key)
  26. 返回一个键-值映射关系,它与小于等于给定键的最大键关联;如果不存在这样的键,则返回 null
  27. K floorKey(K key)
  28. 返回小于等于给定键的最大键;如果不存在这样的键,则返回 null
  29. V get(Object key)
  30. 返回指定键所映射的值,如果对于该键而言,此映射不包含任何映射关系,则返回 null
  31. SortedMap<K,V> headMap(K toKey)
  32. 返回此映射的部分视图,其键值严格小于 toKey
  33. NavigableMap<K,V> headMap(K toKey, boolean inclusive)
  34. 返回此映射的部分视图,其键小于(或等于,如果 inclusive truetoKey
  35. Map.Entry<K,V> higherEntry(K key)
  36. 返回一个键-值映射关系,它与严格大于给定键的最小键关联;如果不存在这样的键,则返回 null
  37. K higherKey(K key)
  38. 返回严格大于给定键的最小键;如果不存在这样的键,则返回 null
  39. Set<K> keySet()
  40. 返回此映射包含的键的 Set 视图。
  41. Map.Entry<K,V> lastEntry()
  42. 返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null
  43. K lastKey()
  44. 返回映射中当前最后一个(最高)键。
  45. Map.Entry<K,V> lowerEntry(K key)
  46. 返回一个键-值映射关系,它与严格小于给定键的最大键关联;如果不存在这样的键,则返回 null
  47. K lowerKey(K key)
  48. 返回严格小于给定键的最大键;如果不存在这样的键,则返回 null
  49. NavigableSet<K> navigableKeySet()
  50. 返回此映射中所包含键的 NavigableSet 视图。
  51. Map.Entry<K,V> pollFirstEntry()
  52. 移除并返回与此映射中的最小键关联的键-值映射关系;如果映射为空,则返回 null
  53. Map.Entry<K,V> pollLastEntry()
  54. 移除并返回与此映射中的最大键关联的键-值映射关系;如果映射为空,则返回 null
  55. V put(K key, V value)
  56. 将指定值与此映射中的指定键进行关联。
  57. void putAll(Map<? extends K,? extends V> map)
  58. 将指定映射中的所有映射关系复制到此映射中。
  59. V remove(Object key)
  60. 如果此 TreeMap 中存在该键的映射关系,则将其删除。
  61. int size()
  62. 返回此映射中的键-值映射关系数。
  63. NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
  64. 返回此映射的部分视图,其键的范围从 fromKey toKey
  65. SortedMap<K,V> subMap(K fromKey, K toKey)
  66. 返回此映射的部分视图,其键值的范围从 fromKey(包括)到 toKey(不包括)。
  67. SortedMap<K,V> tailMap(K fromKey)
  68. 返回此映射的部分视图,其键大于等于 fromKey
  69. NavigableMap<K,V> tailMap(K fromKey, boolean inclusive)
  70. 返回此映射的部分视图,其键大于(或等于,如果 inclusive truefromKey
  71. Collection<V> values()
  72. 返回此映射包含的值的 Collection 视图。

四.源码

源码和16基本相同,这里不做分析,可以查看参考文章。里面有详细的介绍!

五.总结

1、TreeMap是根据key进行排序的,它的排序和定位需要依赖比较器或覆写Comparable接口,也因此不需要key覆写hashCode方法和equals方法,就可以排除掉重复的key,而HashMap的key则需要通过覆写hashCode方法和equals方法来确保没有重复的key。

2、TreeMap的查询、插入、删除效率均没有HashMap高,一般只有要对key排序时才使用TreeMap。

3、TreeMap的key不能为null,而HashMap的key可以为null。

4、TreeMap不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。

  1. SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));

参考文章:

1:【数据结构与算法】二叉排序树C实现(含完整源码)

2:红黑树(一)之 原理和算法详细介绍

3: TreeMap源码剖析

4:TreeMap详细介绍(源码解析)和使用示例


欢迎访问我的csdn博客,我们一同成长!

"不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!"

博客首页:http://blog.csdn.net/u010648555

java集合系列——Map之TreeMap介绍(九)的更多相关文章

  1. java集合系列——Map之HashMap介绍(八)

    1.HashMap的简介 (JDK1.7.0_79版本) HashMap是基于哈希表的Map实现的的,一个Key对应一个Value,允许使用null键和null值,不保证映射的顺序,特别是它不保证该顺 ...

  2. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  3. Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  4. Java 集合系列 06 Stack详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  5. Java 集合系列 05 Vector详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  6. Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  7. Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  8. Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMa ...

  9. 【转】Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例

    概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMa ...

随机推荐

  1. 线性代数-矩阵-【5】矩阵化简 C和C++实现

    点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html [2]矩阵生成:http://www.cnblogs.com/ ...

  2. Java并发编程-阻塞队列

    Java concurrent 包中BlockingQueue接口有ArrayBlockingqueue.LinkedBlockingQueue.PriorityBlockingQueue.Synch ...

  3. javascript页面间传递参数

    1.通过URL传递参数 传递参数页 function setCity() { var str = document.getElementById("cityName"); if ( ...

  4. 利用WHID为隔离主机建立隐秘通道

    0 引言 从2014年BADUSB出现以后,USB-HID攻击就这一直被关注,且具争议.争议的焦点是USB-HID的实战效果过于“鸡肋”,无论从早期的BADUSB,还是到后来的各种USB-HID设备, ...

  5. 为什么a标签中使用img后,高度多了几个像素?

    <li><a href="#"><img src="images/audio.jpg" alt="">& ...

  6. python requests 官方文档

    链接:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

  7. CSS3四个自适应关键字——fill-available、max-content、min-content、fit-content

    前面的话 一般地,有两种自适应:撑满空闲空间与收缩到内容尺寸.CSS3将这两种情况分别定义为'fill-availabel'和'fit-content'.除此之外 ,还新增了更细粒度的'min-con ...

  8. CRC与MD5的异同

    php中CRC32的用法: crc32 - 计算一个字符串的 crc32 多项式 生成 string 参数的 32 位循环冗余校验码多项式--: 这句话从英文翻译过来的,不正确,准确的说应该是这么理解 ...

  9. 201521123054 《Java程序设计》第5周学习总结

    1. 本周学习总结 2. 书面作业 作业参考文件下载 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出 ...

  10. Java课设-购物车系统

    1.团队课程设计博客链接 /[博客链接]http://www.cnblogs.com/yayaya/p/7062197.html 2.个人负责模板或任务说明 1.建立Action类 2.购物车的属性 ...