zoukankan      html  css  js  c++  java
  • 源码分析之Map(一)Map & SortedMap & NavigableMap

     

      数组与链表在处理数据时各有优缺点,数组查询速度很快而插入很慢,链表在插入时表现优秀但查询无力。哈希表则整合了数组与链表的优点,能在插入和查找等方面都有不错的速度。

    Map

      Map也是基于key-value的数据格式,并且key值不可以重复,每个key对应的value唯一。Map的key也可以为null,也不可重。

    public interface Map<K,V> {
        // 返回当前数据个数
      int size();
    
      // 是否为空
      boolean isEmpty();
    
      // 判断是否包含key,这里用到了key的equals方法,所以key必须实现它
      boolean containsKey(Object key);
    
      // 判断是否有key保存的值是value,这也基于equals方法
      boolean containsValue(Object value);
    
      // 通过key获取对应的value值
      V get(Object key);
    
      // 存入key-value
      V put(K key, V value);
    
      // 移除一个key-value对
      V remove(Object key);
    
      // 从其他Map添加
      void putAll(Map<? extends K, ? extends V> m);
    
      // 清空
      void clear();
    
      // 返回所有的key至Set集合中,因为key是不可重的,Set也是不可重的
      Set<K> keySet();
    
      // 返回所有的values
      Collection<V> values();
    
      // 返回key-value对到Set中
      Set<Map.Entry<K, V>> entrySet();
    
      // 希望我们实现equals和hashCode
      boolean equals(Object o);
      int hashCode();
    }

    Map.Entry

      存储在Map中的数据需要实现此接口,主要提供对key和value的操作,也是我们使用最多的操作。该接口是Map的内部接口

    interface Entry<K,V> {
        // 获取对应的key
        K getKey();
    
        // 获取对应的value
        V getValue();
    
        // 替换原有的value
        V setValue(V value);
    
        // 希望我们实现equals和hashCode
        boolean equals(Object o);
        int hashCode();
    
        // 从1.8起,还提供了比较的方法,类似的方法共四个
      public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {
            return (Comparator<Map.Entry<K, V>> & Serializable)
                (c1, c2) -> c1.getKey().compareTo(c2.getKey());
      }
    }

    SortedMap

      由于乱序的数据对查找不利,例如无法使用二分法等降低算法的时间复杂度,如果数据在插入时就排好顺序,查找的性能就会提升很多。SortedMap接口就是为这种有序数据服务的。SortedMap接口需要数据的key支持Comparable,或者可以被指定的Comparator接受。

    public interface SortedMap<K,V> extends Map<K,V> {
        // 返回排序数据所用的Comparator
      Comparator<? super K> comparator();
    
      // 返回在[fromKey, toKey)之间的数据
      SortedMap<K,V> subMap(K fromKey, K toKey);
    
      // 返回从第一个元素到toKey之间的数据
      SortedMap<K,V> headMap(K toKey);
    
      // 返回从fromKey到末尾之间的数据
      SortedMap<K,V> tailMap(K fromKey);
    
      //返回第一个数据的key
      K firstKey();
    
      //返回最后一个数据的key
      K lastKey();
    }

    NavigableMap 

      SortedMap提供了获取最大值与最小值的方法,但对于一个已经排序的数据集,除了最大值与最小值之外,我们可以对任何一个元素,找到比它小的值和比它大的值,还可以按照按照原有的顺序倒序排序等。NavigableMap就为我们提供了这些功能。

    public interface NavigableMap<K,V> extends SortedMap<K,V> {
       // 找到第一个比指定的key小的值
      Map.Entry<K,V> lowerEntry(K key);
    
      // 找到第一个比指定的key小的key
      K lowerKey(K key);
    
      // 找到第一个小于或等于指定key的值
      Map.Entry<K,V> floorEntry(K key);
    
      // 找到第一个小于或等于指定key的key
       K floorKey(K key);
    
      // 找到第一个大于或等于指定key的值
      Map.Entry<K,V> ceilingEntry(K key);
    
      K ceilingKey(K key);
    
      // 找到第一个大于指定key的值
      Map.Entry<K,V> higherEntry(K key);
    
      K higherKey(K key);
    
      // 获取最小值
      Map.Entry<K,V> firstEntry();
    
      // 获取最大值
      Map.Entry<K,V> lastEntry();
    
      // 删除最小的元素
      Map.Entry<K,V> pollFirstEntry();
    
      // 删除最大的元素
      Map.Entry<K,V> pollLastEntry();
    
      //返回一个倒序的Map
      NavigableMap<K,V> descendingMap();
    
      // 返回一个Navigable的key的集合,NavigableSet和NavigableMap类似
      NavigableSet<K> navigableKeySet();
    
      // 对上述集合倒序
      NavigableSet<K> descendingKeySet();
    
    }


  • 相关阅读:
    SpringMVC中静态获取request对象 Spring中获取 HttpServletRequest对象【转载】
    springcloud 的loadbalancer 轮询算法切换方法 2021.4.3
    springboot项目启动增加图标
    rabbitmq 端口作用以及修改方法
    centos8 安装rabbitmq
    springcloud config client Value获取不到信息的问题的处理方法
    springcloud config配置git作为数据源然后启动报错 If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
    Sublime Text的列模式如何操作
    centos8 安装redis
    jQuery简单的Ajax调用
  • 原文地址:https://www.cnblogs.com/ryjJava/p/14334925.html
Copyright © 2011-2022 走看看