zoukankan      html  css  js  c++  java
  • Java TreeMap 介绍和使用

    转自: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.   
    4. // 创建的TreeMap包含Map  
    5. TreeMap(Map<? extends K, ? extends V> copyFrom)  
    6.   
    7. // 指定Tree的比较器  
    8. TreeMap(Comparator<? super K> comparator)  
    9.   
    10. // 创建的TreeSet包含copyFrom  
    11. 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.   
    5. public class TreeMap<K,V>  
    6.     extends AbstractMap<K,V>  
    7.     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. }  
  • 相关阅读:
    python
    spice-vdagent
    no ia32-libs
    git conflict
    wget mirror
    docker !veth
    libprotobuff8.so not found
    angular 列表渲染机制
    Java测试技巧
    react组件生命周期
  • 原文地址:https://www.cnblogs.com/sharpest/p/7807049.html
Copyright © 2011-2022 走看看