Map接口的實現類


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);
View Code

  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();
View Code

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>());
View Code

  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);
View Code

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>());
View Code

  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();
View Code

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>());
View Code

  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();
View Code

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>());
View Code

  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();
View Code


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM