转自:https://www.cnblogs.com/skywang12345/p/3310928.html

概要

这一章,我们对TreeMap进行学习。
我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap。内容包括:
第1部分 TreeMap介绍
第2部分 TreeMap数据结构
第3部分 TreeMap遍历方式

转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928

第1部分 TreeMap介绍

TreeMap 简介

TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。
TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合。
TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
TreeMap 实现了Cloneable接口,意味着它能被克隆
TreeMap 实现了java.io.Serializable接口,意味着它支持序列化

TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n) 。
另外,TreeMap是非同步的。 它的iterator 方法返回的迭代器是fail-fastl的。

TreeMap的构造函数

  1. // 默认构造函数。使用该构造函数,TreeMap中的元素按照自然排序进行排列。
  2. TreeMap()
  3. // 创建的TreeMap包含Map
  4. TreeMap(Map<? extends K, ? extends V> copyFrom)
  5. // 指定Tree的比较器
  6. TreeMap(Comparator<? super K> comparator)
  7. // 创建的TreeSet包含copyFrom
  8. TreeMap(SortedMap<K, ? extends V> copyFrom)

TreeMap的API

  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 为 true)toKey。
  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 为 true)fromKey。
  71. Collection<V> values()
  72. 返回此映射包含的值的 Collection 视图。

第2部分 TreeMap数据结构

TreeMap的继承关系

  1. java.lang.Object
  2. ↳     java.util.AbstractMap<K, V>
  3. ↳     java.util.TreeMap<K, V>
  4. public class TreeMap<K,V>
  5. extends AbstractMap<K,V>
  6. implements NavigableMap<K,V>, Cloneable, java.io.Serializable {}

TreeMap与Map关系如下图:

从图中可以看出:
(01) TreeMap实现继承于AbstractMap,并且实现了NavigableMap接口。
(02) TreeMap的本质是R-B Tree(红黑树),它包含几个重要的成员变量: root, size, comparator。
  root 是红黑数的根节点。它是Entry类型,Entry是红黑数的节点,它包含了红黑数的6个基本组成成分:key(键)、value(值)、left(左孩子)、right(右孩子)、parent(父节点)、color(颜色)。Entry节点根据key进行排序,Entry节点包含的内容为value。 
  红黑数排序时,根据Entry中的key进行排序;Entry中的key比较大小是根据比较器comparator来进行判断的。
  size是红黑数中节点的个数。

关于红黑数的具体算法,请参考"红黑树(一) 原理和算法详细介绍"。

第3部分 TreeMap遍历方式

3.1 遍历TreeMap的键值对

第一步:根据entrySet()获取TreeMap的“键值对”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

  1. // 假设map是TreeMap对象
  2. // map中的key是String类型,value是Integer类型
  3. Integer integ = null;
  4. Iterator iter = map.entrySet().iterator();
  5. while(iter.hasNext()) {
  6. Map.Entry entry = (Map.Entry)iter.next();
  7. // 获取key
  8. key = (String)entry.getKey();
  9. // 获取value
  10. integ = (Integer)entry.getValue();
  11. }

3.2 遍历TreeMap的键

第一步:根据keySet()获取TreeMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

  1. // 假设map是TreeMap对象
  2. // map中的key是String类型,value是Integer类型
  3. String key = null;
  4. Integer integ = null;
  5. Iterator iter = map.keySet().iterator();
  6. while (iter.hasNext()) {
  7. // 获取key
  8. key = (String)iter.next();
  9. // 根据key,获取value
  10. integ = (Integer)map.get(key);
  11. }

3.3 遍历TreeMap的值

第一步:根据value()获取TreeMap的“值”的集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

    1. // 假设map是TreeMap对象
    2. // map中的key是String类型,value是Integer类型
    3. Integer value = null;
    4. Collection c = map.values();
    5. Iterator iter= c.iterator();
    6. while (iter.hasNext()) {
    7. value = (Integer)iter.next();
    8. }

最新文章

  1. IOC Unity
  2. 【转】TCP/IP协议栈及OSI参考模型详解
  3. wampserver解决“不能切换在线”及运行“404问题”
  4. mciSendString 的两个小坑
  5. 【Git学习笔记】初始化Git仓库和版本回退
  6. 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等
  7. T4模版生成多个实体文件时,提示找不到 Host
  8. Unity Manual 用户手册
  9. python3中文字符编码问题
  10. Android成长记(1)-----android环境搭建与adb shell 命令
  11. 服务器:RAID、AHCI、IDE
  12. Ubuntu安装Adobe Reader
  13. sql 在将 nvarchar 值 转换成数据类型 int 时失败。
  14. Java程序员应当知道的10个面向对象设计原则
  15. Java IO流之普通文件流和随机读写流区别
  16. 删除链表中倒数第n个节点
  17. Percona XtraBackup的部分备份与恢复/单库备份/单表备份/指定库备份/指定表备份
  18. C/C++生成随机数
  19. Leetcode_145_Binary Tree Postorder Traversal
  20. 【JavaScrpt】JS之数组去重

热门文章

  1. FluentAPI关系映射配置
  2. 使用 Object.create实现js 继承
  3. Book 树状数组 小结
  4. ZBrush软件中Brush特性
  5. Python介绍与学习
  6. Eclipse中修改GIT分支名称
  7. CF949A Zebras 构造
  8. Pyhton学习——Day5
  9. Python数据分析8-----网页文本处理
  10. [CodeForces]529B Group Photo 2