• [JDK8]Map接口与Dictionary抽象类


    package java.util;

    一、Map接口

    接口定义

    public interface Map<K,V>
    

    Map是存放键值对的数据结构。map中没有重复的key,每个key最多只能映射一个value。map不允许包含自身引用作为key。Map接口用来代替Dictionary抽象类。

    Map接口提供了三种集合视图。map默认顺序是其集合视图迭代器遍历元素的顺序,例如HashMap。TreeMap自定义顺序。

    抽象方法

    2.1 查询操作

    // 返回map中键值对个数。
    // 如果map元素个数多于Integer.MAX_VALUE,返回Integer.MAX_VALUE。
    int size();
    
    // map中存在键值对,返回true
    boolean isEmpty();
    
    // map中存在指定key的映射,返回true。
    boolean containsKey(Object key);
    
    // map中存在一个或多个key映射到指定value,返回true。
    // 性能可能为O(n),n为元素个数。
    boolean containsValue(Object value);
    
    // 获取指定key的映射值
    // 通常值存在返回值,值不存在返回null
    V get(Object key);
    

    2.2 修改操作

    // 向map中插入键值对,若已存在,则更新。
    V put(K key, V value);
    
    // 删除map中指定key的键值对。若不存在,返回null。
    V remove(Object key);
    
    

    2.3 对所有元素的操作

    // 拷贝map中所有映射到当前map中
    // 拷贝过程中,参数map被修改,结果不确定。
    void putAll(Map<? extends K, ? extends V> m);
    
    // 删除map中所有映射
    void clear();
    

    2.4 集合视图

    // 返回map中key的集合视图
    Set<K> keySet();
    
    // 返回map中值的集合视图。
    Collection<V> values();
    
    // 返回map中entry的集合视图
    Set<Map.Entry<K, V>> entrySet();
    

    集合视图依赖于当前map。如果修改map中映射,就会在视图中有所体现。如果在对集合视图迭代的同时修改了map(迭代器自身的操作除外),迭代结果是不确定的。三种集合视图均支持元素的删除,可以通过Iterator.remove、Collection/Set.remove、removeAll、retainAll 和 clear 操作从map中删除对应的键值对。均不支持添加add和addAll操作。

    内部接口Entry
    entry即键值对,Map.entrySet()返回的就是entry的集合,是获取entry引用的唯一途径。Map.Entry对象只在迭代过程中有效。

    interface Entry<K,V> {
        // 返回entry的key
        K getKey();
    
        // 获取entry的value
        V getValue();
    
        // 设定新值
        V setValue(V value);
    
        // 比较当前entry与指定对象
        boolean equals(Object o);
    
        // 计算当前entry的hashcode
        int hashCode();
    
        // 比较器--使用自然排序的key比较Map.Entry
        // 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());
        }
    
        // 比较器--使用自然排序的key比较Map.Entry
        // 1.8增加
        public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue() {
            return (Comparator<Map.Entry<K, V>> & Serializable)
                (c1, c2) -> c1.getValue().compareTo(c2.getValue());
        }
    
        // 比较器--使用给定key比较器比较Map.Entry
        // 1.8增加
        public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp) {
            Objects.requireNonNull(cmp);
            return (Comparator<Map.Entry<K, V>> & Serializable)
                (c1, c2) -> cmp.compare(c1.getKey(), c2.getKey());
        }
    
        // 比较器--使用给定value比较器比较Map.Entry
        // 1.8增加
        public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp) {
            Objects.requireNonNull(cmp);
            return (Comparator<Map.Entry<K, V>> & Serializable)
                (c1, c2) -> cmp.compare(c1.getValue(), c2.getValue());
        }
    }
    

    2.5 比较和hash

    // 比较当前map与给定对象
    boolean equals(Object o);
    
    // 获取当前map的哈希值
    // 值等于map中每个entry哈希值的和。
    int hashCode();
    

    默认方法(1.8增加)

    JDK8中增加几个默认方法,默认方法主要针对某些操作的实现,减少代码编写量。默认方法也结合了函数接口和lambda表达式进行实现。需要注意的是,默认方法实现是线程不安全的,并发场景使用需要重写。

    版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    区间DP入门
    Prime Permutation(思维好题 )
    小字辈 (bfs好题)
    博弈论小结之尼姆博弈
    Hometask
    Lucky Sum (dfs打表)
    对称博弈
    尼姆博弈
    莫队算法 ( MO's algorithm )
    Codeforces 988D Points and Powers of Two ( 思维 || 二的幂特点 )
  • 原文地址:https://www.cnblogs.com/dtyy/p/11055116.html
Copyright © 2020-2023  润新知