package java.util;java
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();
JDK8中增長几個默認方法,默認方法主要針對某些操做的實現,減小代碼編寫量。默認方法也結合了函數接口和lambda表達式進行實現。須要注意的是,默認方法實現是線程不安全的,併發場景使用須要重寫。