1.簡述
Map沒有繼承Collection接口,Map提供key到value的映射(唯一,無序)。可以保存null,但是只有一個,第二個key,是空的時候會覆蓋第一個key的value(也就是key不能重復,value可以),能夠實現根據key快速查找value。Map支持泛型,形式如:Map<K,V>。
Map接口中有以下幾個常用實現類:
- HashMap:無序、線程不安全。
- TreeMap:有序(根據鍵排序,可自定義Comparator)、線程不安全。
- HashTable:無序、線程安全(鎖全表)、不允許為null,性能較差。
- ConcurrentHashMap(一般用於多線程情況下):無序、線程安全(鎖一個桶),性能較好。
- LinkedHashMap:有序、線程不安全,根據插入順序、訪問遍歷的HashMap。
2.HashMap
HashMap是基於哈希表的Map接口的非同步實現。此實現提供所有可選的映射操作,並允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恆久不變。
需要注意的是:因為HashMap不是同步的,如果多個線程同時訪問一個HashMap,而其中至少一個線程從結構上(指添加或者刪除一個或多個映射關系的任何操作)修改了,則必須保持外部同步,以防止對映射進行意外的非同步訪問。
定義一個HashMap的方式有如下幾種:

//創建一個HashMap集合,默認初始容量為16,默認負載因子為0.75 Map<String, String> map = new HashMap<String, String>(); //創建一個HashMap集合,設置初始容量,默認負載因子為0.75 map = new HashMap<String, String>(30); //創建一個HashMap集合,設置初始容量和負載因子 map = new HashMap<String, String>(30, 0.8f);
HashMap有很多常用方法,put、putAll、get、keySet、remove、size、isEmpty等,關於其他方法可以查看API。
常用方法說明如下:

//將指定的值與此映射中的指定鍵相關聯 V put(K key, V value); //將指定地圖的所有映射復制到此地圖 void putAll(Map<? extends K,? extends V> m); //如果指定的鍵尚未與某個值相關聯(或映射到 null ),則將其與給定值相關聯並返回 null ,否則返回當前值 V putIfAbsent(K key, V value); //返回到指定鍵所映射的值,或 null如果此映射包含該鍵的映射 V get(Object key); //返回此地圖中包含的鍵的Set視圖 Set<K> keySet(); //返回此地圖中包含的映射的Set視圖 Set<Map.Entry<K,V>> entrySet(); //返回此地圖中包含的值的Collection視圖 Collection<V> values(); //對此映射中的每個條目執行給定的操作,直到所有條目都被處理或操作引發異常 void forEach(BiConsumer<? super K,? super V> action); //返回到指定鍵所映射的值,或 defaultValue如果此映射包含該鍵的映射 V getOrDefault(Object key, V defaultValue); //如果指定的鍵尚未與值相關聯或與null相關聯,則將其與給定的非空值相關聯 V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction); //如果此映射包含指定鍵的映射,則返回 true boolean containsKey(Object key); //如果此地圖將一個或多個鍵映射到指定值,則返回 true boolean containsValue(Object value); //如果此地圖不包含鍵值映射,則返回 true boolean isEmpty(); //返回此地圖中鍵值映射的數量 int size(); //嘗試計算用於指定鍵和其當前映射的值的映射(或 null如果沒有當前映射) V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction); //如果指定的鍵尚未與值相關聯(或映射到 null ),則嘗試使用給定的映射函數計算其值,並將其輸入到此映射中,除非 null V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction); //如果指定的密鑰的值存在且非空,則嘗試計算給定密鑰及其當前映射值的新映射 V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction); //只有當目標映射到某個值時,才能替換指定鍵的條目 V replace(K key, V value); //僅當當前映射到指定的值時,才能替換指定鍵的條目 boolean replace(K key, V oldValue, V newValue); //將每個條目的值替換為對該條目調用給定函數的結果,直到所有條目都被處理或該函數拋出異常 void replaceAll(BiFunction<? super K,? super V,? extends V> function); //返回此HashMap實例的淺拷貝:鍵和值本身不被克隆 Object clone(); //從該地圖中刪除指定鍵的映射(如果存在) V remove(Object key); //僅當指定的密鑰當前映射到指定的值時刪除該條目 boolean remove(Object key, Object value); //從這張地圖中刪除所有的映射 void clear();
3.TreeMap
TreeMap基於紅黑樹(Red-Black tree)實現。該映射根據其鍵的自然順序進行排序,或者根據創建映射時提供的Comparator 進行排序,具體取決於使用的構造方法。
定義一個TreeMap的方式有如下幾種:

//創建一個HashMap集合,按照key的自然順序排列 Map<String, String> map = new TreeMap<String, String>(); //創建一個HashMap集合,傳遞Comparator具體實現,按照該實現規則進行排序 map = new TreeMap<String, String>(new Comparator<String>() { public int compare(String o1, String o2) { return 0; } }); //傳遞一個map實體構建TreeMap集合,按照默認規則排序 map = new TreeMap<String, String>(new HashMap<String,String>()); //傳遞一個map實體構建TreeMap,按照傳遞的map的排序規則進行排序 map = new TreeMap<String, String>(new TreeMap<String,String>());
TreeMap有很多常用方法,put、putAll、get、keySet、remove、size、isEmpty等,關於其他方法可以查看API。
常用方法說明如下:

//將指定的值與此映射中的指定鍵相關聯 V put(K key, V value); //將指定地圖的所有映射復制到此地圖 void putAll(Map<? extends K,? extends V> map); //返回到指定鍵所映射的值,或 null如果此映射包含該鍵的映射 V get(Object key); //返回此地圖中包含的鍵的Set視圖 Set<K> keySet(); //返回此集合中包含的映射的Set視圖 Set<Map.Entry<K,V>> entrySet(); //返回此集合中包含的值的Collection視圖 Collection<V> values(); //返回與該集合中的最小鍵相關聯的鍵值映射,如果集合為空,則返回 null Map.Entry<K,V> firstEntry(); //返回此集合中當前的第一個(最低)鍵 K firstKey(); //返回與小於或等於給定鍵的最大鍵相關聯的鍵值映射,如果沒有此鍵,則 null Map.Entry<K,V> floorEntry(K key); //返回小於或等於給定鍵的最大鍵,如果沒有這樣的鍵,則返回 null K floorKey(K key); //只有當目標映射到某個值時,才能替換指定鍵的條目 V replace(K key, V value); //僅當當前映射到指定的值時,才能替換指定鍵的條目 boolean replace(K key, V oldValue, V newValue); //將每個條目的值替換為對該條目調用給定函數的結果,直到所有條目都被處理或該函數拋出異常 void replaceAll(BiFunction<? super K,? super V,? extends V> function); //對此映射中的每個條目執行給定的操作,直到所有條目都被處理或操作引發異常 void forEach(BiConsumer<? super K,? super V> action); //返回此集合中包含鍵的相反順序NavigableSet NavigableSet<K> descendingKeySet(); //返回此映射中包含的映射的反向排序視圖 NavigableMap<K,V> descendingMap(); //返回與大於或等於給定鍵的最小鍵相關聯的鍵值映射,如果沒有此鍵,則 null Map.Entry<K,V> ceilingEntry(K key); //返回大於或等於給定鍵的 null鍵,如果沒有此鍵,則返回 null K ceilingKey(K key); //如果此映射包含指定鍵的映射,則返回 true boolean containsKey(Object key); //如果此集合中有一個或多個鍵映射到指定值,則返回 true boolean containsValue(Object value); //返回此地圖中鍵值映射的數量 int size(); //從集合中刪除所有的映射 void clear(); //返回此TreeMap實例的淺拷貝 Object clone(); //返回用於訂購此地圖中的鍵的比較器,或null如果此地圖使用其鍵的natural ordering Comparator<? super K> comparator(); //返回與該地圖中最大關鍵字關聯的鍵值映射,如果地圖為空,則返回 null Map.Entry<K,V> lastEntry(); //返回當前在此地圖中的最后(最高)鍵 K lastKey(); //返回與最大密鑰相關聯的密鑰值映射嚴格小於給定密鑰,如果沒有這樣的密鑰,則 null Map.Entry<K,V> lowerEntry(K key); //返回嚴格小於給定鍵的最大鍵,如果沒有這樣的鍵,則返回 null K lowerKey(K key); //返回此地圖中包含的鍵的NavigableSet視圖 NavigableSet<K> navigableKeySet(); //刪除並返回與該地圖中的最小鍵相關聯的鍵值映射,如果地圖為空,則返回 null Map.Entry<K,V> pollFirstEntry(); //刪除並返回與該地圖中最大密鑰相關聯的鍵值映射,如果地圖為空,則返回 null Map.Entry<K,V> pollLastEntry(); //從此TreeMap中刪除此鍵的映射(如果存在) V remove(Object key);
4.HashTable
HashTable類和HashMap用法幾乎一樣,底層實現幾乎一樣,只不過HashTable的方法添加了synchronized關鍵字確保線程同步檢查,效率較低。
定義一個HashTable的方式有如下幾種:

//創建一個Hashtable集合,默認初始容量(11)和負載因子(0.75) Map<String, String> map = new Hashtable<String, String>(); //創建一個Hashtable集合,具有指定的初始容量和默認負載因子(0.75) map = new Hashtable<String, String>(12); //創建一個Hashtable集合,具有指定的初始容量和指定的負載因子 map = new Hashtable<String, String>(12, 0.8f); //構造一個包含指定 Map中的元素的新Hashtable。 map = new Hashtable<String, String>(new HashMap<String, String>());
HashTable有很多常用方法,put、putAll、get、keySet、remove、size、isEmpty等,關於其他方法可以查看API。
常用方法說明如下:

//清除此散列表,使其不包含鍵 void clear(); //創建這個散列表的淺拷貝 Object clone(); //嘗試計算指定鍵的映射及其當前映射的值(如果沒有當前映射, null ) V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction); //如果指定的鍵尚未與某個值相關聯(或映射到 null ),則嘗試使用給定的映射函數計算其值,並將其輸入到此映射中,除非 null V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction); //如果指定的密鑰的值存在且非空,則嘗試計算給定密鑰及其當前映射值的新映射 V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction); //測試一些鍵映射到這個哈希表中的指定值 boolean contains(Object value); //測試指定的對象是否在此哈希表中的鍵 boolean containsKey(Object key); //如果此哈希表將一個或多個鍵映射到此值,則返回true boolean containsValue(Object value); //返回此散列表中值的枚舉 Enumeration<V> elements(); //返回此地圖中包含的映射的Set視圖 Set<Map.Entry<K,V>> entrySet(); //根據Map界面中的定義,將指定的對象與此Map進行比較以相等 boolean equals(Object o); //對此映射中的每個條目執行給定的操作,直到所有條目都被處理或操作引發異常 void forEach(BiConsumer<? super K,? super V> action); //返回到指定鍵所映射的值,或 null如果此映射包含該鍵的映射 V get(Object key); //返回到指定鍵所映射的值,或 defaultValue如果此映射包含該鍵的映射 V getOrDefault(Object key, V defaultValue); //按照Map界面中的定義返回此Map的哈希碼值 int hashCode(); //測試這個哈希表是否將值映射到值 boolean isEmpty(); //返回此散列表中鍵的枚舉 Enumeration<K> keys(); //返回此地圖中包含的鍵的Set視圖 Set<K> keySet(); //如果指定的鍵尚未與值相關聯或與null相關聯,則將其與給定的非空值相關聯 V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction); //將指定的 key映射到此 key value中指定的value V put(K key, V value); //將所有從指定地圖的映射復制到此散列表 void putAll(Map<? extends K,? extends V> t); //如果指定的鍵尚未與值相關聯(或映射到 null )將其與給定值相關聯並返回 null ,否則返回當前值 V putIfAbsent(K key, V value); //增加這個散列表的內部重組能力,從而更有效地適應和訪問其條目 protected void rehash(); //從此散列表中刪除鍵(及其對應的值) V remove(Object key); //僅當指定的密鑰當前映射到指定的值時刪除該條目 boolean remove(Object key, Object value); //只有當目標映射到某個值時,才能替換指定鍵的條目 V replace(K key, V value); //僅當當前映射到指定的值時,才能替換指定鍵的條目 boolean replace(K key, V oldValue, V newValue); //將每個條目的值替換為對該條目調用給定函數的結果,直到所有條目都被處理或該函數拋出異常 void replaceAll(BiFunction<? super K,? super V,? extends V> function); //返回此哈希表中的鍵數 int size(); //以一組條目的形式返回此 Hashtable對象的字符串表示形式,其括在大括號中,並以ASCII字符“ , ”(逗號和空格)分隔 String toString(); //返回此地圖中包含的值的Collection視圖 Collection<V> values();
5.ConcurrentHashMap
並發編程實踐中,ConcurrentHashMap是一個經常被使用的數據結構,相比於Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在線程安全的基礎上提供了更好的寫並發能力,但同時降低了對讀一致性的要求。ConcurrentHashMap的設計與實現非常精巧,大量的利用了volatile,final,CAS等lock-free技術來減少鎖競爭對於性能的影響。
定義一個ConcurrentHashMap的方式有如下幾種:

//創建一個ConcurrentHashMap集合,默認的初始表大小(16) Map<String, String> map = new ConcurrentHashMap<String, String>(); //創建一個ConcurrentHashMap集合,其初始表格大小適應指定數量的元素,而不需要動態調整大小 map = new ConcurrentHashMap<String, String>(30); //創建一個ConcurrentHashMap集合,給定元素數量和初始表密度 map = new ConcurrentHashMap<String, String>(30, 0.8f); //創建一個ConcurrentHashMap集合,給定元素數量,表密度,和同時更新線程 map = new ConcurrentHashMap<String, String>(30, 0.8f, 20); //構造一個包含指定Map中的元素的新ConcurrentHashMap map = new ConcurrentHashMap<String, String>(new HashMap<String,String>());
ConcurrentHashMap有很多常用方法,put、putAll、get、keySet、remove、size、isEmpty等,關於其他方法可以查看API。
常用方法說明如下:

//從這張地圖中刪除所有的映射 void clear(); //嘗試計算用於指定鍵和其當前映射的值的映射(或 null如果沒有當前映射) V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction); //如果指定的鍵尚未與值相關聯,則嘗試使用給定的映射函數計算其值,並將其輸入到此映射中,除非 null V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction); //如果存在指定鍵的值,則嘗試計算給出鍵的新映射及其當前映射值 V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction); //傳統方法測試如果一些鍵映射到此表中的指定值 boolean contains(Object value); //測試此表中的指定對象是否為鍵 boolean containsKey(Object key); //如果此映射將一個或多個鍵映射到指定的值,則返回 true boolean containsValue(Object value); //返回此表中值的枚舉 Enumeration<V> elements(); //返回此地圖中包含的映射的Set視圖 Set<Map.Entry<K,V>> entrySet(); //將指定的對象與此映射進行比較以獲得相等性 boolean equals(Object o); //對此映射中的每個條目執行給定的操作,直到所有條目都被處理或操作引發異常 void forEach(BiConsumer<? super K,? super V> action); //對每個(鍵,值)執行給定的動作 void forEach(long parallelismThreshold, BiConsumer<? super K,? super V> action); //對每個(key,value)的每個非空變換執行給定的動作 <U> void forEach(long parallelismThreshold, BiFunction<? super K,? super V,? extends U> transformer, Consumer<? super U> action); //對每個條目執行給定的操作 void forEachEntry(long parallelismThreshold, Consumer<? super Map.Entry<K,V>> action); //對每個條目的每個非空變換執行給定的操作 <U> void forEachEntry(long parallelismThreshold, Function<Map.Entry<K,V>,? extends U> transformer, Consumer<? super U> action); //對每個鍵執行給定的動作 void forEachKey(long parallelismThreshold, Consumer<? super K> action); //對每個鍵的每個非空變換執行給定的動作 <U> void forEachKey(long parallelismThreshold, Function<? super K,? extends U> transformer, Consumer<? super U> action); //對每個值執行給定的操作 void forEachValue(long parallelismThreshold, Consumer<? super V> action); //對每個值的每個非空轉換執行給定的動作 <U> void forEachValue(long parallelismThreshold, Function<? super V,? extends U> transformer, Consumer<? super U> action); //返回到指定鍵所映射的值,或 null如果此映射包含該鍵的映射 V get(Object key); //返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回給定的默認值 V getOrDefault(Object key, V defaultValue); //返回此Map的哈希代碼值,即映射中每個鍵值對的總和,即key.hashCode() ^ value.hashCode() int hashCode(); //如果此地圖不包含鍵值映射,則返回 true boolean isEmpty(); //返回此表中鍵的枚舉 Enumeration<K> keys(); //返回此地圖中包含的鍵的Set視圖 ConcurrentHashMap.KeySetView<K,V> keySet(); //返回此地圖中鍵的Set視圖,使用給定的公用映射值進行任何添加(即Collection.add(E)和Collection.addAll(Collection) ) ConcurrentHashMap.KeySetView<K,V> keySet(V mappedValue); //返回映射數 long mappingCount(); //如果指定的鍵尚未與(非空)值相關聯,則將其與給定值相關聯 V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction); //創建一個新的Set支持的ConcurrentHashMap從給定的類型到Boolean.TRUE static <K> ConcurrentHashMap.KeySetView<K,Boolean> newKeySet(); //創建一個新的Set支持的ConcurrentHashMap從給定的類型到Boolean.TRUE static <K> ConcurrentHashMap.KeySetView<K,Boolean> newKeySet(int initialCapacity); //將指定的鍵映射到此表中的指定值 V put(K key, V value); //將指定地圖的所有映射復制到此映射 void putAll(Map<? extends K,? extends V> m); //如果指定的鍵尚未與值相關聯,請將其與給定值相關聯 V putIfAbsent(K key, V value); //返回使用給定的reducer將所有(key,value)對的給定變換累加到組合值的結果,如果沒有則返回null <U> U reduce(long parallelismThreshold, BiFunction<? super K,? super V,? extends U> transformer, BiFunction<? super U,? super U,? extends U> reducer); //返回使用給定的reducer累加所有條目的結果,以組合值,如果沒有則返回null Map.Entry<K,V> reduceEntries(long parallelismThreshold, BiFunction<Map.Entry<K,V>,Map.Entry<K,V>,? extends Map.Entry<K,V>> reducer); //返回使用給定的reducer將所有條目的給定變換累加到組合值的結果,否則返回null <U> U reduceEntries(long parallelismThreshold, Function<Map.Entry<K,V>,? extends U> transformer, BiFunction<? super U,? super U,? extends U> reducer); //返回使用給定的reducer累加給定變換的結果,以組合值,給定基礎作為一個標識值 double reduceEntriesToDouble(long parallelismThreshold, ToDoubleFunction<Map.Entry<K,V>> transformer, double basis, DoubleBinaryOperator reducer); //返回使用給定的reducer累加給定變換的結果,以組合值,給定基礎作為一個標識值 int reduceEntriesToInt(long parallelismThreshold, ToIntFunction<Map.Entry<K,V>> transformer, int basis, IntBinaryOperator reducer); //返回使用給定的reducer累加給定變換的結果,以組合值,給定基礎作為一個標識值 long reduceEntriesToLong(long parallelismThreshold, ToLongFunction<Map.Entry<K,V>> transformer, long basis, LongBinaryOperator reducer); //返回使用給定的reducer累加所有鍵的結果,以組合值,如果沒有則返回null K reduceKeys(long parallelismThreshold, BiFunction<? super K,? super K,? extends K> reducer); //返回使用給定的reducer累加所有鍵的給定變換以組合值的結果,如果沒有則返回null <U> U reduceKeys(long parallelismThreshold, Function<? super K,? extends U> transformer, BiFunction<? super U,? super U,? extends U> reducer); //返回使用給定的reducer累加所有鍵的給定變換的結果,以組合值,給定基礎作為標識值 double reduceKeysToDouble(long parallelismThreshold, ToDoubleFunction<? super K> transformer, double basis, DoubleBinaryOperator reducer); //返回使用給定的reducer累加所有鍵的給定變換的結果,以組合值,給定基礎作為標識值 int reduceKeysToInt(long parallelismThreshold, ToIntFunction<? super K> transformer, int basis, IntBinaryOperator reducer); //返回使用給定的reducer累加所有鍵的給定變換的結果,以組合值,給定基礎作為標識值 long reduceKeysToLong(long parallelismThreshold, ToLongFunction<? super K> transformer, long basis, LongBinaryOperator reducer); //返回使用給定的reducer將所有(key,value)對的給定變換累加到結合值的結果,給定的基數作為一個標識值 double reduceToDouble(long parallelismThreshold, ToDoubleBiFunction<? super K,? super V> transformer, double basis, DoubleBinaryOperator reducer); //返回使用給定的reducer將所有(key,value)對的給定變換累加到結合值的結果,給定的基數作為一個標識值 int reduceToInt(long parallelismThreshold, ToIntBiFunction<? super K,? super V> transformer, int basis, IntBinaryOperator reducer); //返回使用給定的reducer將所有(key,value)對的給定變換累加到結合值的結果,給定的基數作為一個標識值 long reduceToLong(long parallelismThreshold, ToLongBiFunction<? super K,? super V> transformer, long basis, LongBinaryOperator reducer); //返回使用給定的reducer累加所有值的結果,以組合值,如果沒有則返回null V reduceValues(long parallelismThreshold, BiFunction<? super V,? super V,? extends V> reducer); //返回使用給定的reducer累加所有值的給定變換以組合值的結果,否則返回null <U> U reduceValues(long parallelismThreshold, Function<? super V,? extends U> transformer, BiFunction<? super U,? super U,? extends U> reducer); //返回使用給定的reducer累加所有值的給定變換的結果,以組合值,給定基礎作為標識值 double reduceValuesToDouble(long parallelismThreshold, ToDoubleFunction<? super V> transformer, double basis, DoubleBinaryOperator reducer); //返回使用給定的reducer累加所有值的給定變換的結果,以組合值,給定基礎作為標識值 int reduceValuesToInt(long parallelismThreshold, ToIntFunction<? super V> transformer, int basis, IntBinaryOperator reducer); //返回使用給定的reducer累加所有值的給定變換的結果,以組合值,給定基礎作為標識值 long reduceValuesToLong(long parallelismThreshold, ToLongFunction<? super V> transformer, long basis, LongBinaryOperator reducer); //從該地圖中刪除鍵(及其對應的值) V remove(Object key); //僅當當前映射到給定值時才刪除密鑰的條目 boolean remove(Object key, Object value); //僅當當前映射到某個值時才替換該項的條目 V replace(K key, V value); //僅當當前映射到給定值時才替換密鑰的條目 boolean replace(K key, V oldValue, V newValue); //將每個條目的值替換為對該條目調用給定函數的結果,直到所有條目都被處理或該函數拋出異常 void replaceAll(BiFunction<? super K,? super V,? extends V> function); //通過在每個(鍵,值)上應用給定的搜索函數返回非空結果,如果沒有則返回null <U> U search(long parallelismThreshold, BiFunction<? super K,? super V,? extends U> searchFunction); //返回一個非空結果,從每個條目應用給定的搜索函數,如果沒有,則返回null <U> U searchEntries(long parallelismThreshold, Function<Map.Entry<K,V>,? extends U> searchFunction); //返回一個非空結果,在每個鍵上應用給定的搜索功能,如果沒有,返回null <U> U searchKeys(long parallelismThreshold, Function<? super K,? extends U> searchFunction); //返回一個非空結果,對每個值應用給定的搜索函數,如果沒有,返回null <U> U searchValues(long parallelismThreshold, Function<? super V,? extends U> searchFunction); //返回此地圖中鍵值映射的數量 int size(); //返回此地圖的字符串表示形式 String toString(); //返回此地圖中包含的值的Collection視圖 Collection<V> values();
6.LinkedHashMap
LinkedHashMap是帶鏈表的HashMap,所以LinkedHashMap是有序,LinkedHashMap作為HashMap的擴展,它改變了HashMap無序的特征。它使用了一個雙向的鏈表來會維護key-value對的次序,該鏈表維護了map的迭代順序,該迭代順序和key-value對的插入順序保持一致。
定義一個LinkedHashMap的方式有如下幾種:

//創建一個LinkedHashMap集合,默認的初始化容量(16)和負載因子(0.75) Map<String, String> map = new LinkedHashMap<String, String>(); //創建一個LinkedHashMap集合,指定初始容量 map = new LinkedHashMap<String, String>(30); //創建一個LinkedHashMap集合,指定初始容量和負載因子 map = new LinkedHashMap<String, String>(30, 0.8f); //創建一個LinkedHashMap集合,指定初始容量、負載因子和訂購模式 map = new LinkedHashMap<String, String>(30, 0.8f, true); //構造一個包含指定Map中的元素的新LinkedHashMap。 map = new LinkedHashMap<String, String>(new HashMap<String, String>());
LinkedHashMap有很多常用方法,put、putAll、get、keySet、remove、size、isEmpty等,關於其他方法可以查看API。
常用方法說明如下:

//從這張地圖中刪除所有的映射 void clear(); //如果該地圖將一個或多個鍵映射到指定的值,則返回 true boolean containsValue(Object value); //返回此地圖中包含的映射的Set視圖 Set<Map.Entry<K,V>> entrySet(); //對此映射中的每個條目執行給定的操作,直到所有條目都被處理或操作引發異常 void forEach(BiConsumer<? super K,? super V> action); //返回到指定鍵所映射的值,或 null如果此映射包含該鍵的映射 V get(Object key); //返回到指定鍵所映射的值,或 defaultValue如果此映射包含該鍵的映射 V getOrDefault(Object key, V defaultValue); //返回此地圖中包含的鍵的Set視圖 Set<K> keySet(); //如果此地圖應刪除其最老的條目,則返回 true protected boolean removeEldestEntry(Map.Entry<K,V> eldest); //將每個條目的值替換為對該條目調用給定函數的結果,直到所有條目都被處理或該函數拋出異常 void replaceAll(BiFunction<? super K,? super V,? extends V> function); //返回此地圖中包含的值的Collection視圖 Collection<V> values();