20-Map

作者: 鹏程1995 | 来源:发表于2020-02-04 15:22 被阅读0次

    类简介

    Map是一个保存“键值对”的对象。所以:

    1. “键”也就是key不能重复
    2. 一个“键”对应一个值

    Map接口提供了三种进行遍历的方法:

    1. 获得一个keyIterator

    2. 获得一个valueCollection

    3. 获得一个关于EntryIterator,其中EntryMap的内部类

    当然,如果Map中的元素是有顺序的,返回的结果也会有顺序。

    Mapkey不能引自己,但是value可以。

    还有,Map尽量不要把容易改变的对象作为key

    Iterator,Collection一样,要提供两个构造方法,后面的不再详述。

    改变结构的方法,比如增删改,可能会抛UnsupportedOperationException异常。

    添加或者修改的数据如果非法可能会抛异常。

    Map中的很多和查找有关的方法都是依赖key或者valueequals()方法,所以记得根据自己的需求重写Objectequals()

    类源码简介

    Map<K,V>K表示key,V表示value

    方法

    int size();

    boolean isEmpty();

    boolean containsKey(Object key);

    boolean containsValue(Object value);

    V get(Object key);

    V put(K key, V value);

    put和http请求的那个put差不多,是修改的意思,返回的是老的value,如果返回空表示

    1. 修改失败
    2. map支持null且原来的值是null

    V remove(Object key);

    void putAll(Map<? extends K, ? extends V> m);

    void clear();

    Set<K> keySet();

    返回一个以集合中所有的key作为元素的Set

    注意:

    Map中对key的修改会影响到这个Set

    举个栗子:

    我先得到了一个Set A,然后遍历Set A时,有人对Map做了增删(总之是一切能影响到key的操作),这样在遍历Set A时会出现失败或者其他的情况。(Collection在遍历时不允许修改元素)

    Collection<V> values();

    1. 见名知意
    2. 该注意的和上边的一样

    Set<Map.Entry<K, V>> entrySet();

    1. 同上一个接口
    2. 关于Entry的介绍看下边

    boolean equals(Object o);

    int hashCode();

    default V getOrDefault(Object key, V defaultValue)

    get()方法做了一个包装,get()发现key不存在时返回null,这个返回传入的defaultValue

    default void forEach(BiConsumer<? super K, ? super V> action)

    对每个元素调用传入的action()方法,关于函数式接口我们后面专门记录。

    default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)

    对泛型的解释如下:

    1. BiFunction<? super K, ? super V, ? extends V> function)我们设为BiFunction<A,B,C> function)
    2. 则该方法等同C function(A,B)
    3. 考虑到逻辑,可以表示为newValue function(key,OldValue)
    4. 我们知道java的一种上转型规律,即A = B,则A属性是B或者B的父类
    5. 因为oldValue属性是V,则B=V,所以B属性应该是V或者V的父类,所以B? super V
    6. 因为newValue属性是V,返回的结果是V,则V=C,所以C属性应该是V或者V的子类,所以C? extends V

    default V putIfAbsent(K key, V value)

    如果没有或者存在但是valuenull就执行put操作

    default boolean remove(Object key, Object value)

    default boolean replace(K key, V oldValue, V newValue)

    default V replace(K key, V value)

    default V computeIfAbsent(K key,Function<? super K, ? extends V> mappingFunction)

    如果没有或者存在但是valuenull【调用get()返回null】就调用函数mappingFunction()

    default V computeIfPresent(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction)

    如果调用get()返回不是null,则调用remappingFunction()方法计算

    default V compute(K key,BiFunction<? super K, ? super V, ? extends V> remappingFunction)

    keykey的映射调用方法remappingFunction()

    default V merge(K key, V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction)

    oldValue和传入的value进行合并,如果oldValue==null则取值value,负责调用remappingFunction()获得新值。值结果为空则移除映射,否则设置新值。

    内部类 Entry<K,V>

    K getKey();

    V getValue();

    V setValue(V value);

    boolean equals(Object o);

    int hashCode();

    public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey();

    返回一个Comparator用来比较。凑,我先看那个吧,这个看不下去了。后面再完善这部分。

    public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue()

    public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp)

    public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp)

    相关文章

      网友评论

          本文标题:20-Map

          本文链接:https://www.haomeiwen.com/subject/vdbrxhtx.html