[JDK8]Map接口與Dictionary抽象類

package java.util;java

1、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 集合視圖ui

// 返回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對象只在迭代過程當中有效。code

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表達式進行實現。須要注意的是,默認方法實現是線程不安全的,併發場景使用須要重寫。

相關文章
相關標籤/搜索