zoukankan      html  css  js  c++  java
  • treemap使用了解

    参考了https://www.jianshu.com/p/d9ad7f6d75a0

    https://www.zhuxiaodong.net/2018/collection-in-java-treemap/

    https://yanglukuan.github.io/2017/09/06/java/Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E4%B9%8BTreeMap%E8%AF%A6%E8%A7%A3/

    https://blog.csdn.net/yan_wenliang/article/details/51092633

    心不够静,先了解treemap,心静脑子到位的时候再吃透原理

    存储结构

    分析一个数据类型最好的办法就是看它的内部存储结构,通过分析存储的数据结构,我们可以更清楚的看到它的实现原理和方法,从而更好的去使用,因为特定的数据结构只有用在特定的场景下,才会发挥它最大的作用。
    TreeMap内部使用的数据结构为红黑树(Red-Black tree),关于红黑树,这里简单介绍一下,红黑树属于二叉排序树,但是在二叉排序树的基础上,又增加了一些规则,比如定义节点的着色等,这样就不会出现一些极端的情况,比如,整个树出现了偏离,变为了单分支结构的树,这样,整个树的高度就是n,n为全部的节点数。在这样的节点分部情况下,查找一个节点所需的时间复杂度为O(n),为了避免这样的情况,聪明的人类又发明了另一种树形结构,叫做平衡二叉树,平衡二叉树查找、插入和删除在平均和最坏情况下的时间复杂度都是 O(logn)。红黑树就是平衡二叉树的一种实现方式。红黑树定义了一些规则,保证树的高度维持在logn

    1、每个结点要么是红的要么是黑的。
    2、根结点是黑的。
    3、每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
    4、如果一个结点是红的,那么它的两个儿子都是黑的。
    5、对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。

    红黑树

    规则

    1、基于红黑树(Red-Black tree)的数据结构实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
    2、不允许插入为Nullkey
    3、可以插入值为NullValue
    4、若Key重复,则后面插入的直接覆盖原来的Value
    5、非线程安全
    6、根据key排序,key必须实现Comparable接口,可自定义比较器实现排序。
    7、TreeMap使用的数据结构决定了他的插入操作变的比较复杂,需要维护一个红黑树,所以TreeMap不适合用在频繁修改的场景,如果不需要实现有序性,则建议使用HashMap,存取效率要高一些。

    类继承关系

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

    • 1.Map 接口: 定义将键值映射到值的对象,Map规定不能包含重复的键值,每个键最多可以映射一个值,这个接口是用来替换Dictionary类。
    • 2.AbstractMap 类: 提供了一个Map骨架的实现,尽量减少了实现Map接口所需要的工作量
    • 3.SortedMap 接口: 定义按照key排序的Map结构,规定key-value是根据键key值的自然排序进行排序的,或者根据构造key-value时设定的构造器进行排序。
    • 4.NavigableMap 接口: 是SortedMap接口的子接口,在其基础上扩展了针对搜索目标返回最近匹配项的导航方法,例如方法lowEntry、floorEntry、ceilingEntry等,如果不存在这样的键,则返回null
    • 5.Cloneable 接口: 实现了该接口的类可以显示的调用Object.clone()方法,合法的对该类实例进行字段复制,如果没有实现Cloneable接口的实例上调用Obejct.clone()方法,会抛出CloneNotSupportException异常。正常情况下,实现了Cloneable接口的类会以公共方法重写Object.clone()
    • 6.Serializable 接口: 实现了该接口标示了类可以被序列化和反序列化,具体的 查询序列化详解

    SortedMap接口


    既然如此,我们就先说一下SortedMap接口

    public interface SortedMap<K,V> extends Map<K,V> {
    Comparator<? super K> comparator(); //用来返回这个map用的比较器,或者null
    SortedMap<K,V> subMap(K fromKey, K toKey); //返回部分map满足key大于等于fromKey,小于toKey
    SortedMap<K,V> headMap(K toKey); //返回部分map满足key小于toKey
    SortedMap<K,V> tailMap(K fromKey); //返回部分map满足key大于等于fromKey
    K firstKey(); //返回第一个key(最小的key)
    K lastKey(); //返回最后一个key(最大的key)
    Set<K> keySet();
    Collection<V> values();
    Set<Map.Entry<K, V>> entrySet();
    }


    TreeMap接口

    Entry<K, V>                ceilingEntry(K key) //返回键不小于key的最小键值对entry
    K                          ceilingKey(K key) //返回键不小于key的最小键
    void                       clear() //清空TreeMap
    Object                     clone() //克隆TreeMap
    Comparator<? super K>      comparator() //比较器
    boolean                    containsKey(Object key) //是否包含键为key的键值对
    NavigableSet<K>            descendingKeySet() //获取降序排列key的Set集合
    NavigableMap<K, V>         descendingMap() //获取降序排列的Map
    Set<Entry<K, V>>           entrySet() //获取键值对entry的Set集合
    Entry<K, V>                firstEntry() //第一个entry
    K                          firstKey() //第一个key
    Entry<K, V>                floorEntry(K key) //获取不大于key的最大键值对
    K                          floorKey(K key) //获取不大于key的最大Key
    V                          get(Object key) //获取键为key的值value
    NavigableMap<K, V>         headMap(K to, boolean inclusive) //获取从第一个节点开始到to的子Map, inclusive表示是否包含to节点
    SortedMap<K, V>            headMap(K toExclusive) //获取从第一个节点开始到to的子Map, 不包括toExclusive
    Entry<K, V>                higherEntry(K key) //获取键大于key的最小键值对
    K                          higherKey(K key) //获取键大于key的最小键
    boolean                    isEmpty() //判空
    Set<K>                     keySet() //获取key的Set集合
    Entry<K, V>                lastEntry() //最后一个键值对
    K                          lastKey() //最后一个键
    Entry<K, V>                lowerEntry(K key) //键小于key的最大键值对
    K                          lowerKey(K key) //键小于key的最大键值对
    NavigableSet<K>            navigableKeySet() //返回key的Set集合
    Entry<K, V>                pollFirstEntry() //获取第一个节点,并删除
    Entry<K, V>                pollLastEntry() //获取最后一个节点并删除
    V                          put(K key, V value) //插入一个节点
    V                          remove(Object key) //删除键为key的节点
    int                        size() //Map大小
    SortedMap<K, V>            subMap(K fromInclusive, K toExclusive) //获取从fromInclusive到toExclusive子Map,前闭后开
    NavigableMap<K, V>         subMap(K from, boolean fromInclusive, K to, boolean toInclusive)
    NavigableMap<K, V>         tailMap(K from, boolean inclusive) //获取从from开始到最后的子Map,inclusive标志是否包含from
    SortedMap<K, V>            tailMap(K fromInclusive)
    

      

    Entry<K, V>                ceilingEntry(K key) //返回键不小于key的最小键值对entry
    K                          ceilingKey(K key)//返回键不小于key的最小键
    void                       clear()//清空TreeMapObjectclone()//克隆TreeMap
    Comparator<? super K>      comparator()//比较器
    boolean                    containsKey(Object key)//是否包含键为key的键值对
    NavigableSet<K>            descendingKeySet()//获取降序排列key的Set集合
    NavigableMap<K, V>         descendingMap()//获取降序排列的Map
    Set<Entry<K, V>>           entrySet()//获取键值对entry的Set集合
    Entry<K, V>                firstEntry()//第一个entry
    K                          firstKey()//第一个key
    Entry<K, V>                floorEntry(K key)//获取不大于key的最大键值对
    K                          floorKey(K key)//获取不大于key的最大Key
    V                          get(Object key)//获取键为key的值value
    NavigableMap<K, V>         headMap(K to, boolean inclusive)//获取从第一个节点开始到to的子Map, inclusive表示是否包含to节点
    SortedMap<K, V>            headMap(K toExclusive)//获取从第一个节点开始到to的子Map, 不包括toExclusive
    Entry<K, V>                higherEntry(K key)//获取键大于key的最小键值对
    K                          higherKey(K key)//获取键大于key的最小键
    boolean                    isEmpty()//判空
    Set<K>                     keySet()//获取key的Set集合
    Entry<K, V>                lastEntry()//最后一个键值对
    K                          lastKey()//最后一个键
    Entry<K, V>                lowerEntry(K key)//键小于key的最大键值对
    K                          lowerKey(K key)//键小于key的最大键值对
    NavigableSet<K>            navigableKeySet()//返回key的Set集合
    Entry<K, V>                pollFirstEntry()//获取第一个节点,并删除
    Entry<K, V>                pollLastEntry()//获取最后一个节点并删除
    V                          put(K key, V value)//插入一个节点
    V                          remove(Object key)//删除键为key的节点
    int                        size()//Map大小
    SortedMap<K, V>            subMap(K fromInclusive, K toExclusive)//获取从fromInclusive到toExclusive子Map,前闭后开
    NavigableMap<K, V>         subMap(K from, boolean fromInclusive, K to, boolean toInclusive)
    NavigableMap<K, V>         tailMap(K from, boolean inclusive)//获取从from开始到最后的子Map,inclusive标志是否包含from
    SortedMap<K, V>            tailMap(K fromInclusive)






    最后留个大牛写的treemap的深度解析 设计红黑树实现的
    https://www.cnblogs.com/chenssy/p/3746600.html
  • 相关阅读:
    Python Day14
    Python Day13
    Python Day12
    Python Day11
    Python Day10
    Python Day9
    Python Day8
    Python Day7
    Python Day6
    Python Day5
  • 原文地址:https://www.cnblogs.com/heroinss/p/11732008.html
Copyright © 2011-2022 走看看