中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Map的介紹的使用方法

發布時間:2021-06-22 15:49:03 來源:億速云 閱讀:127 作者:chen 欄目:大數據

本篇內容主要講解“Map的介紹的使用方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Map的介紹的使用方法”吧!

Map的架構

Map的介紹的使用方法

  • Map是一個映射接口,不同于List和Set的是他不繼承于Collection接口,Map中存儲的內容是鍵值對(key-value)。

  • AbstractMap 是繼承于Map的抽象類,它實現了Map中的大部分API。其它Map的實現類可以通過繼承AbstractMap來減少重復編碼。

  • SortedMap 是繼承于Map的接口。SortedMap中的內容是排序的鍵值對,排序的方法是通過比較器(Comparator)。

  • NavigableMap 是繼承于SortedMap的接口。相比于SortedMap,NavigableMap有一系列的導航方法;如"獲取大于/等于某對象的鍵值對"、“獲取小于/等于某對象的鍵值對”等等。

  • Map的主要實現類是HashMap、LinkedHashMap、TreeMap、HashTable等。

HashMap

  • 繼承于AbstractMap

  • 保存無序的鍵值對

  • 非線程安全,元素可為null

LinkedHashMap

  • 繼承于HashMap

  • 保存有序的鍵值對,默認提供插入時的順序,也可構造成訪問順序。

  • 非線程安全,元素不可為null

TreeMap

  • 繼承于AbstractMap,且實現了NavigableMap接口

  • 保存有序的鍵值對,默認對key排序,也可構造自定義的排序。

  • 非線程安全,元素不可為null

HashTable

  • 但它繼承于Dictionary,而且也實現Map接口

  • 保存無序的鍵值對

  • 線程安全,元素可為null

Map的源碼解析

Entry

interface 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() {
        return (Comparator<Map.Entry<K, V>> & Serializable)
                (c1, c2) -> c1.getKey().compareTo(c2.getKey());
    }
    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());
    }
    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());
    }
    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());
    }
}

Map中的方法

/** 返回當前Map中鍵值對的數量 **/
int size();

/** 返回當前Map是否為空 **/
boolean isEmpty();

/** 返回當前Map是否包含鍵key **/
boolean containsKey(Object key);

/** 返回當前Map是否包含值value **/
boolean containsValue(Object value);

/** 返回當前Map中鍵key對應的值value **/
V get(Object key);

/** 將當前Map中鍵key對應的值設置為value  **/
V put(K key, V value);

/** 移除當前Map中鍵key對應的值  **/
V remove(Object key);

/** 將m中所有鍵值對放到當前Map中 **/
void putAll(Map<? extends K, ? extends V> m);

/** 移除Map中所有鍵值對 **/
void clear();

/** 返回Map中key的集合 **/
Set<K> keySet();

/** 返回Map中value的集合 **/
Collection<V> values();

/** 返回Map中key-value的集合 **/
Set<Map.Entry<K, V>> entrySet();

Map中1.8新增的方法

/** 根據key獲取value 如果value為空返回默認值defaultValue **/
default V getOrDefault(Object key, V defaultValue) {
    V v;
    return (((v = get(key)) != null) || containsKey(key)) ? v : defaultValue;
}

/** 函數式編程 遍歷map中鍵值對 **/
default void forEach(BiConsumer<? super K, ? super V> action) {
    Objects.requireNonNull(action);
    for (Map.Entry<K, V> entry : entrySet()) {
        K k;
        V v;
        try {
            k = entry.getKey();
            v = entry.getValue();
        } catch(IllegalStateException ise) {
            // this usually means the entry is no longer in the map.
            throw new ConcurrentModificationException(ise);
        }
        action.accept(k, v);
    }
}

/** 函數式編程 提供一個方法 替換所有的value **/
default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
    Objects.requireNonNull(function);
    for (Map.Entry<K, V> entry : entrySet()) {
        K k;
        V v;
        try {
            k = entry.getKey();
            v = entry.getValue();
        } catch(IllegalStateException ise) {
            // this usually means the entry is no longer in the map.
            throw new ConcurrentModificationException(ise);
        }

        // ise thrown from function is not a cme.
        v = function.apply(k, v);

        try {
            entry.setValue(v);
        } catch(IllegalStateException ise) {
            // this usually means the entry is no longer in the map.
            throw new ConcurrentModificationException(ise);
        }
    }
}

/** 如果map中key為空 則往map中放入key-value **/
default V putIfAbsent(K key, V value) {
    V v = get(key);
    if (v == null) {
        v = put(key, value);
    }

    return v;
}

/** 如果Map中的key對應的值是value 則移除此鍵值對 否則返回false **/
default boolean remove(Object key, Object value) {
    Object curValue = get(key);
    if (!Objects.equals(curValue, value) ||
            (curValue == null && !containsKey(key))) {
        return false;
    }
    remove(key);
    return true;
}

/** 如果Map中的key對應的值是oldValue 則用newValue替換oldValue 否則返回false **/
default boolean replace(K key, V oldValue, V newValue) {
    Object curValue = get(key);
    if (!Objects.equals(curValue, oldValue) ||
            (curValue == null && !containsKey(key))) {
        return false;
    }
    put(key, newValue);
    return true;
}

/** 如果Map中存在key鍵 則替換為value 否則返回false **/
default V replace(K key, V value) {
    V curValue;
    if (((curValue = get(key)) != null) || containsKey(key)) {
        curValue = put(key, value);
    }
    return curValue;
}

/** 如果Map中key對應的value為空 則將key計算后設置為key對應的value **/
default V computeIfAbsent(K key,
                          Function<? super K, ? extends V> mappingFunction) {
    Objects.requireNonNull(mappingFunction);
    V v;
    if ((v = get(key)) == null) {
        V newValue;
        if ((newValue = mappingFunction.apply(key)) != null) {
            put(key, newValue);
            return newValue;
        }
    }

    return v;
}

/** 如果Map中 key對應的oldValue為空 則返回null
 * 否則根據key和oldValue計算出新的newValue   如果newValue不為空則put到Map中 如果為空 則移除此鍵值對 **/
default V computeIfPresent(K key,
                           BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    V oldValue;
    if ((oldValue = get(key)) != null) {
        V newValue = remappingFunction.apply(key, oldValue);
        if (newValue != null) {
            put(key, newValue);
            return newValue;
        } else {
            remove(key);
            return null;
        }
    } else {
        return null;
    }
}

/** 根據Map中的key和對應的oldValue計算出newValue
 * 如果newValue為空 且oldValue不為空 則移除此鍵值對
 * 如果newValue為空 且oldValue為空且不存在key 返回null
 * 如果newValue不為空 則put到Map中 **/
default V compute(K key,
                  BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    V oldValue = get(key);

    V newValue = remappingFunction.apply(key, oldValue);
    if (newValue == null) {
        // delete mapping
        if (oldValue != null || containsKey(key)) {
            // something to remove
            remove(key);
            return null;
        } else {
            // nothing to do. Leave things as they were.
            return null;
        }
    } else {
        // add or replace old mapping
        put(key, newValue);
        return newValue;
    }
}

/** 根據Map中的key查找oldValue 如果oldValue為空 則設置newValue為oldValue  否則根據oldValue和value計算出newValue
 * 如果newValue為空 則移除此鍵值對  否則設置key的值為newValue **/
default V merge(K key, V value,
                BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    Objects.requireNonNull(value);
    V oldValue = get(key);
    V newValue = (oldValue == null) ? value :
            remappingFunction.apply(oldValue, value);
    if(newValue == null) {
        remove(key);
    } else {
        put(key, newValue);
    }
    return newValue;
}

到此,相信大家對“Map的介紹的使用方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

map
AI

济南市| 中超| 长岛县| 睢宁县| 永福县| 泰来县| 义马市| 桂平市| 浠水县| 兰考县| 青阳县| 池州市| 无极县| 海晏县| 福清市| 宝山区| 鄂伦春自治旗| 新巴尔虎左旗| 肥乡县| 禄丰县| 内丘县| 望谟县| 娄烦县| 措美县| 柳河县| 丘北县| 论坛| 泉州市| 三都| 凌源市| 龙海市| 保亭| 临猗县| 邵武市| 梓潼县| 甘孜| 永清县| 手游| 苗栗市| 永靖县| 沙田区|