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();
    
    }


  • 相关阅读:
    记住一些英语谚语、格言或名人名言
    *英语词汇经济危机
    Windows XP Home Edition 中文版 安装IIS
    *英语词汇低碳
    14个优化网站性能提高网站访问速度技巧
    日全食 欧盟一体化 词汇
    英语词汇索马里海盗事件
    Ant实用脚本
    nginx配置数据结构及合并过程
    关于网页皮肤切换
  • 原文地址:https://www.cnblogs.com/ryjJava/p/14334925.html
Copyright © 2011-2022 走看看