鴻蒙OS HashMap

2022-07-22 15:53 更新

HashMap

java.lang.Object

|---java.util.AbstractMap<K,V&

|---|---java.util.HashMap<K,V&

public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable

Map 接口的基于哈希表的實(shí)現(xiàn)。 此實(shí)現(xiàn)提供所有可選的映射操作,并允許空值和空鍵。 (HashMap 類大致相當(dāng)于 Hashtable,除了它是不同步的并且允許空值。)這個類不保證映射的順序; 特別是,它不保證訂單會隨著時間的推移保持不變。

此實(shí)現(xiàn)為基本操作(get 和 put)提供恒定時間性能,假設(shè)哈希函數(shù)將元素正確地分散在桶中。 集合視圖的迭代需要的時間與 HashMap 實(shí)例的“容量”(桶的數(shù)量)加上它的大?。ㄦI值映射的數(shù)量)成正比。 因此,如果迭代性能很重要,則不要將初始容量設(shè)置得太高(或負(fù)載因子太低),這一點(diǎn)非常重要。

HashMap 的實(shí)例有兩個影響其性能的參數(shù):初始容量和負(fù)載因子。 容量是哈希表中的桶數(shù),初始容量只是哈希表創(chuàng)建時的容量。 負(fù)載因子是哈希表在其容量自動增加之前允許達(dá)到的程度的度量。 當(dāng)哈希表中的條目數(shù)超過負(fù)載因子和當(dāng)前容量的乘積時,對哈希表進(jìn)行重新哈希(即重建內(nèi)部數(shù)據(jù)結(jié)構(gòu)),使哈希表具有大約兩倍的桶數(shù)。

作為一般規(guī)則,默認(rèn)負(fù)載因子 (.75) 在時間和空間成本之間提供了良好的折衷。 較高的值會減少空間開銷,但會增加查找成本(反映在 HashMap 類的大多數(shù)操作中,包括 get 和 put)。 在設(shè)置其初始容量時,應(yīng)考慮映射中的預(yù)期條目數(shù)及其負(fù)載因子,以盡量減少重新哈希操作的次數(shù)。 如果初始容量大于最大條目數(shù)除以負(fù)載因子,則不會發(fā)生重新哈希操作。

如果要在 HashMap 實(shí)例中存儲許多映射,則創(chuàng)建具有足夠大容量的映射將比讓它根據(jù)需要執(zhí)行自動重新散列以增長表來更有效地存儲映射。 請注意,使用具有相同 hashCode() 的多個鍵是降低任何哈希表性能的可靠方法。 為了改善影響,當(dāng)鍵是 Comparable 時,此類可以使用鍵之間的比較順序來幫助打破平局。

請注意,此實(shí)現(xiàn)不同步。 如果多個線程同時訪問一個哈希映射,并且至少有一個線程在結(jié)構(gòu)上修改了映射,則必須在外部進(jìn)行同步。 (結(jié)構(gòu)修改是添加或刪除一個或多個映射的任何操作;僅更改與實(shí)例已包含的鍵關(guān)聯(lián)的值不是結(jié)構(gòu)修改。)這通常通過在自然封裝映射的某個對象上同步來完成 . 如果不存在這樣的對象,則應(yīng)使用 Collections#synchronizedMap 方法“包裝”地圖。 這最好在創(chuàng)建時完成,以防止對地圖的意外不同步訪問:

   Map m = Collections.synchronizedMap(new HashMap(...));

所有此類的“集合視圖方法”返回的迭代器都是快速失敗的:如果在創(chuàng)建迭代器后的任何時間對映射進(jìn)行結(jié)構(gòu)修改,除了通過迭代器自己的 remove 方法之外,迭代器將拋出 ConcurrentModificationException . 因此,面對并發(fā)修改,迭代器快速而干凈地失敗,而不是在未來不確定的時間冒任意的、非確定性的行為。

請注意,不能保證迭代器的快速失敗行為,因為一般來說,在存在不同步的并發(fā)修改的情況下,不可能做出任何硬保證。 快速失敗的迭代器會盡最大努力拋出 ConcurrentModificationException。 因此,編寫一個依賴于這個異常的正確性的程序是錯誤的:迭代器的快速失敗行為應(yīng)該只用于檢測錯誤。

此類是 Java 集合框架的成員。

嵌套類摘要

從類 java.util.AbstractMap 繼承的嵌套類/接口
AbstractMap.SimpleEntryK,V, AbstractMap.SimpleImmutableEntryK,V
從接口 java.util.Map 繼承的嵌套類/接口
Map.EntryK,V

構(gòu)造函數(shù)摘要

構(gòu)造函數(shù) 描述
HashMap() 構(gòu)造一個具有默認(rèn)初始容量 (16) 和默認(rèn)加載因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity) 構(gòu)造一個具有指定初始容量和默認(rèn)加載因子 (0.75) 的空 HashMap。
HashMap(int initialCapacity, float loadFactor) 構(gòu)造一個具有指定初始容量和負(fù)載因子的空 HashMap。
HashMap(Map<? extends K,? extends V> m) 構(gòu)造一個與指定 Map 具有相同映射的新 HashMap。

方法總結(jié)

修飾符和類型 方法 描述
void clear() 從此 map 中刪除所有映射。
Object clone() 返回此 HashMap 實(shí)例的淺表副本:鍵和值本身沒有被克隆。
V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 嘗試計算指定鍵及其當(dāng)前映射值的映射(如果沒有當(dāng)前映射,則為 null)。
V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) 如果指定的鍵尚未與值關(guān)聯(lián)(或映射為 null),則嘗試使用給定的映射函數(shù)計算其值并將其輸入到此映射中,除非為 null。
V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 如果指定鍵的值存在且非空,則嘗試在給定鍵及其當(dāng)前映射值的情況下計算新映射。
boolean containsKey(Object key) 如果此映射包含指定鍵的映射,則返回 true。
boolean containsValue(Object value) 如果此映射將一個或多個鍵映射到指定值,則返回 true。
SetMap.EntryK,V entrySet() 返回此映射中包含的映射的 Set 視圖。
void forEach(BiConsumer<? super K,? super V> action) 對該映射中的每個條目執(zhí)行給定的操作,直到處理完所有條目或該操作引發(fā)異常。
V get(Object key) 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 null。
V getOrDefault(Object key, V defaultValue) 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 defaultValue。
boolean isEmpty() 如果此映射不包含鍵值映射,則返回 true。
SetK keySet() 返回此映射中包含的鍵的 Set 視圖。
V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) 如果指定的鍵尚未與值關(guān)聯(lián)或與 null 關(guān)聯(lián),則將其與給定的非 null 值關(guān)聯(lián)。
V put(K key, V value) 將指定的值與此映射中的指定鍵相關(guān)聯(lián)。
void putAll(Map<? extends K,? extends V> m) 將所有映射從指定映射復(fù)制到此映射。
V putIfAbsent(K key, V value) 如果指定的鍵尚未與值關(guān)聯(lián)(或映射到 null),則將其與給定值關(guān)聯(lián)并返回 null,否則返回當(dāng)前值。
V remove(Object key) 如果存在,則從此映射中刪除指定鍵的映射。
boolean remove(Object key, Object value) 僅當(dāng)當(dāng)前映射到指定值時,才刪除指定鍵的條目。
V replace(K key, V value) 僅當(dāng)當(dāng)前映射到某個值時才替換指定鍵的條目。
boolean replace(K key, V oldValue, V newValue) 僅當(dāng)當(dāng)前映射到指定值時才替換指定鍵的條目。
void replaceAll(BiFunction<? super K,? super V,? extends V> function) 將每個條目的值替換為對該條目調(diào)用給定函數(shù)的結(jié)果,直到所有條目都已處理或該函數(shù)引發(fā)異常。
int size() 返回此映射中鍵值映射的數(shù)量。
CollectionV values() 返回此映射中包含的值的集合視圖。
從類 java.util.AbstractMap 繼承的方法
equals, hashCode, toString
從接口 java.util.Map 繼承的方法
equals, hashCode
從類 java.lang.Object 繼承的方法
finalize, getClass, notify, notifyAll, wait, wait, wait

構(gòu)造函數(shù)詳細(xì)信息

HashMap

public HashMap(int initialCapacity, float loadFactor)

構(gòu)造一個具有指定初始容量和負(fù)載因子的空 HashMap。

參數(shù):

參數(shù)名稱 參數(shù)描述
initialCapacity 初始容量
loadFactor 負(fù)載系數(shù)

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果初始容量為負(fù)或負(fù)載因子為非正

HashMap

public HashMap(int initialCapacity)

構(gòu)造一個具有指定初始容量和默認(rèn)加載因子 (0.75) 的空 HashMap。

參數(shù):

參數(shù)名稱 參數(shù)描述
initialCapacity 初始容量。

Throws:

Throw名稱 Throw描述
IllegalArgumentException 如果初始容量為負(fù)。

HashMap

public HashMap()

構(gòu)造一個具有默認(rèn)初始容量 (16) 和默認(rèn)加載因子 (0.75) 的空 HashMap。

HashMap

public HashMap(Map<? extends K,? extends V> m)

構(gòu)造一個與指定 Map 具有相同映射的新 HashMap。 HashMap 是使用默認(rèn)加載因子 (0.75) 和足以容納指定 Map 中的映射的初始容量創(chuàng)建的。

參數(shù):

參數(shù)名稱 參數(shù)描述
m 其映射將放置在此 map 中的 map

Throws:

Throw名稱 Throw描述
NullPointerException 如果指定的 map 為空

方法詳情

size

public int size()

返回此映射中鍵值映射的數(shù)量。

指定者:

接口 MapK,V 中的大小

覆蓋:

AbstractMapK,V 類中的大小

返回:

此映射中的鍵值映射的數(shù)量

isEmpty

public boolean isEmpty()

如果此映射不包含鍵值映射,則返回 true。

指定者:

接口 MapK,V 中的 isEmpty

覆蓋:

AbstractMapK,V 類中的 isEmpty

返回:

如果此映射不包含鍵值映射,則為 true

get

public V get(Object key)

返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 null。

更正式地說,如果此映射包含從鍵 k 到值 v 的映射,使得 (key==null ? k==null : key.equals(k)),則此方法返回 v; 否則返回null。 (最多可以有一個這樣的映射。)

返回值為 null 并不一定表示該映射不包含該鍵的映射; 映射也可能將鍵顯式映射為空。 containsKey 操作可用于區(qū)分這兩種情況。

指定者:

進(jìn)入接口 MapK,V

覆蓋:

進(jìn)入類 AbstractMapK,V

參數(shù):

參數(shù)名稱 參數(shù)描述
key 要返回其關(guān)聯(lián)值的鍵

返回:

指定鍵映射到的值,如果此映射不包含該鍵的映射,則為 null

containsKey

public boolean containsKey(Object key)

如果此映射包含指定鍵的映射,則返回 true。

指定者:

containsKey 在接口 MapK,V

覆蓋:

類 AbstractMapK,V 中的 containsKey

參數(shù):

參數(shù)名稱 參數(shù)描述
key 要測試在此映射中是否存在的鍵

返回:

如果此映射包含指定鍵的映射,則為 true。

put

public V put(K key, V value)

將指定的值與此映射中的指定鍵相關(guān)聯(lián)。 如果映射先前包含鍵的映射,則替換舊值。

指定者:

放入接口 MapK,V

覆蓋:

放入類 AbstractMapK,V

參數(shù):

參數(shù)名稱 參數(shù)描述
key 與指定值關(guān)聯(lián)的鍵
value 與指定鍵關(guān)聯(lián)的值

返回:

與 key 關(guān)聯(lián)的前一個值,如果沒有 key 映射,則返回 null。 (返回 null 還可以指示映射先前將 null 與 key 關(guān)聯(lián)。)

putAll

public void putAll(Map<? extends K,? extends V> m)

將所有映射從指定映射復(fù)制到此映射。 這些映射將替換此映射對當(dāng)前指定映射中的任何鍵的任何映射。

指定者:

putAll在接口MapK,V中

覆蓋:

putAll 在類 AbstractMapK,V

參數(shù):

參數(shù)名稱 參數(shù)描述
m 要存儲在此 map 中的映射

Throws:

Throw名稱 Throw描述
NullPointerException 如果指定的 map 為空

remove

public V remove(Object key)

如果存在,則從此映射中刪除指定鍵的映射。

指定者:

在接口 MapK,V 中移除

覆蓋:

在類 AbstractMapK,V 中刪除

參數(shù):

參數(shù)名稱 參數(shù)描述
key 要從映射中刪除其映射的鍵

返回:

與 key 關(guān)聯(lián)的前一個值,如果沒有 key 映射,則返回 null。 (返回 null 還可以指示映射先前將 null 與 key 關(guān)聯(lián)。)

clear

public void clear()

從此 map 中刪除所有映射。 此調(diào)用返回后,map 將為空。

指定者:

在界面 MapK,V 中清除

覆蓋:

在類 AbstractMapK,V 中清除

containsValue

public boolean containsValue(Object value)

如果此映射將一個或多個鍵映射到指定值,則返回 true。

指定者:

接口 MapK,V 中的 containsValue

覆蓋:

類 AbstractMapK,V 中的 containsValue

參數(shù):

參數(shù)名稱 參數(shù)描述
value 要測試其在此映射中的存在的值

返回:

如果此映射將一個或多個鍵映射到指定值,則為 true

keySet

public SetK keySet()

返回此映射中包含的鍵的 Set 視圖。 集合由 map 支持,因此對地圖的更改會反映在集合中,反之亦然。 如果在對集合進(jìn)行迭代時修改了映射(通過迭代器自己的刪除操作除外),則迭代的結(jié)果是不確定的。 該集合支持元素移除,即通過 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作從映射中移除相應(yīng)的映射。 它不支持 add 或 addAll 操作。

指定者:

接口 MapK,V 中的 keySet

覆蓋:

AbstractMapK,V 類中的 keySet

返回:

此 map 中包含的鍵的集合視圖

values

public CollectionV values()

返回此映射中包含的值的集合視圖。 集合由 map 支持,因此對地圖的更改會反映在集合中,反之亦然。 如果在對集合進(jìn)行迭代時修改了映射(通過迭代器自己的刪除操作除外),則迭代的結(jié)果是不確定的。 該集合支持元素移除,即通過 Iterator.remove、Collection.remove、removeAll、retainAll 和 clear 操作從映射中移除相應(yīng)的映射。 它不支持 add 或 addAll 操作。

指定者:

接口 MapK,V 中的值

覆蓋:

AbstractMapK,V 類中的值

返回:

此 map 中包含的值的視圖

entrySet

public SetMap.EntryK,V entrySet()

返回此映射中包含的映射的 Set 視圖。 集合由 map 支持,因此對地圖的更改會反映在集合中,反之亦然。 如果在對集合進(jìn)行迭代時修改了映射(通過迭代器自己的刪除操作或通過迭代器返回的映射條目上的 setValue 操作除外),則迭代的結(jié)果是未定義的。 該集合支持元素移除,即通過 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作從映射中移除相應(yīng)的映射。 它不支持 add 或 addAll 操作。

指定者:

接口 MapK,V 中的 entrySet

指定者:

AbstractMapK,V 類中的 entrySet

返回:

此 map 中包含的映射的集合視圖

getOrDefault

public V getOrDefault(Object key, V defaultValue)

從接口復(fù)制的描述:map

返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 defaultValue。

指定者:

接口 MapK,V 中的 getOrDefault

參數(shù):

參數(shù)名稱 參數(shù)描述
key 要返回其關(guān)聯(lián)值的鍵
defaultValue 鍵的默認(rèn)映射

返回:

指定鍵映射到的值,如果此映射不包含該鍵的映射,則為 defaultValue

putIfAbsent

public V putIfAbsent(K key, V value)

從接口復(fù)制的描述:map

如果指定的鍵尚未與值關(guān)聯(lián)(或映射到 null),則將其與給定值關(guān)聯(lián)并返回 null,否則返回當(dāng)前值。

指定者:

接口 MapK,V 中的 putIfAbsent

參數(shù):

參數(shù)名稱 參數(shù)描述
key 與指定值關(guān)聯(lián)的鍵
value 與指定鍵關(guān)聯(lián)的值

返回:

與指定鍵關(guān)聯(lián)的前一個值,如果鍵沒有映射,則返回 null。 (如果實(shí)現(xiàn)支持 null 值,則返回 null 還可以指示映射先前將 null 與鍵關(guān)聯(lián)。)

remove

public boolean remove(Object key, Object value)

從接口復(fù)制的描述:map

僅當(dāng)當(dāng)前映射到指定值時,才刪除指定鍵的條目。

指定者:

在接口 MapK,V 中移除

參數(shù):

參數(shù)名稱 參數(shù)描述
key 與指定值關(guān)聯(lián)的鍵
value 預(yù)期與指定鍵關(guān)聯(lián)的值

返回:

如果值已被刪除,則為 true

replace

public boolean replace(K key, V oldValue, V newValue)

從接口復(fù)制的描述:map

僅當(dāng)當(dāng)前映射到指定值時才替換指定鍵的條目。

指定者:

在接口 MapK,V 中替換

參數(shù):

參數(shù)名稱 參數(shù)描述
key 與指定值關(guān)聯(lián)的鍵
oldValue 預(yù)期與指定鍵關(guān)聯(lián)的值
newValue 與指定鍵關(guān)聯(lián)的值

返回:

如果值被替換,則為 true

replace

public V replace(K key, V value)

從接口復(fù)制的描述:map

僅當(dāng)當(dāng)前映射到某個值時才替換指定鍵的條目。

指定者:

在接口 MapK,V 中替換

參數(shù):

參數(shù)名稱 參數(shù)描述
key 與指定值關(guān)聯(lián)的鍵
value 與指定鍵關(guān)聯(lián)的值

返回:

與指定鍵關(guān)聯(lián)的前一個值,如果鍵沒有映射,則返回 null。 (如果實(shí)現(xiàn)支持 null 值,則返回 null 還可以指示映射先前將 null 與鍵關(guān)聯(lián)。)

computeIfAbsent

public V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)

從接口復(fù)制的描述:map

如果指定的鍵尚未與值關(guān)聯(lián)(或映射為 null),則嘗試使用給定的映射函數(shù)計算其值并將其輸入到此映射中,除非為 null。

如果函數(shù)返回 null,則不記錄映射。 如果函數(shù)本身拋出(未經(jīng)檢查的)異常,則重新拋出異常,并且不記錄任何映射。 最常見的用法是構(gòu)造一個新對象作為初始映射值或記憶結(jié)果,如下所示:

  map.computeIfAbsent(key, k -> new Value(f(k))); 

或者實(shí)現(xiàn)一個多值映射,Map<K,Collection<V>>,每個鍵支持多個值:

  map.computeIfAbsent(key, k -> new HashSet<V>()).add(v); 

指定者:

接口 MapK,V 中的 computeIfAbsent

參數(shù):

參數(shù)名稱 參數(shù)描述
key 與指定值關(guān)聯(lián)的鍵
mappingFunction 計算值的函數(shù)

返回:

與指定鍵關(guān)聯(lián)的當(dāng)前(現(xiàn)有或計算的)值,如果計算的值為 null,則為 null

computeIfPresent

public V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)

從接口復(fù)制的描述:地圖

如果指定鍵的值存在且非空,則嘗試在給定鍵及其當(dāng)前映射值的情況下計算新映射。

如果函數(shù)返回 null,則刪除映射。 如果函數(shù)本身拋出(未經(jīng)檢查的)異常,則重新拋出異常,并且當(dāng)前映射保持不變。

指定者:

接口 MapK,V 中的 computeIfPresent

參數(shù):

參數(shù)名稱 參數(shù)描述
key 與指定值關(guān)聯(lián)的鍵
remappingFunction 計算值的函數(shù)

返回:

與指定鍵關(guān)聯(lián)的新值,如果沒有,則為 null

compute

public V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)

從接口復(fù)制的描述:Map

嘗試計算指定鍵及其當(dāng)前映射值的映射(如果沒有當(dāng)前映射,則為 null)。 例如,要創(chuàng)建或附加 String msg 到值映射:

  map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))

(方法 merge() 通常更容易用于此類目的。)

如果函數(shù)返回 null,則刪除映射(如果最初不存在,則保持不存在)。 如果函數(shù)本身拋出(未經(jīng)檢查的)異常,則重新拋出異常,并且當(dāng)前映射保持不變。

指定者:

在接口 MapK,V 中計算

參數(shù):

參數(shù)名稱 參數(shù)描述
key 與指定值關(guān)聯(lián)的鍵
remappingFunction 計算值的函數(shù)

返回:

與指定鍵關(guān)聯(lián)的新值,如果沒有,則為 null

merge

public V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)

從接口復(fù)制的描述:Map

如果指定的鍵尚未與值關(guān)聯(lián)或與 null 關(guān)聯(lián),則將其與給定的非 null 值關(guān)聯(lián)。 否則,將關(guān)聯(lián)的值替換為給定重映射函數(shù)的結(jié)果,如果結(jié)果為 null,則將其刪除。 當(dāng)為一個鍵組合多個映射值時,此方法可能很有用。 例如,要創(chuàng)建或附加 String msg 到值映射:

  map.merge(key, msg, String::concat) 

如果函數(shù)返回 null,則刪除映射。 如果函數(shù)本身拋出(未經(jīng)檢查的)異常,則重新拋出異常,并且當(dāng)前映射保持不變。

指定者:

在接口 MapK,V 中合并

參數(shù):

參數(shù)名稱 參數(shù)描述
key 與結(jié)果值關(guān)聯(lián)的鍵
value 要與鍵關(guān)聯(lián)的現(xiàn)有值合并的非空值,或者如果沒有現(xiàn)有值或空值與鍵關(guān)聯(lián),則與鍵關(guān)聯(lián)
remappingFunction 重新計算值的函數(shù)(如果存在)

返回:

與指定鍵關(guān)聯(lián)的新值,如果沒有值與該鍵關(guān)聯(lián),則為 null

forEach

public void forEach(BiConsumer<? super K,? super V> action)

從接口復(fù)制的描述:地圖

對該映射中的每個條目執(zhí)行給定的操作,直到處理完所有條目或該操作引發(fā)異常。 除非實(shí)現(xiàn)類另有規(guī)定,否則按照條目集迭代的順序執(zhí)行動作(如果指定了迭代順序)。動作拋出的異常將轉(zhuǎn)發(fā)給調(diào)用者。

指定者:

接口 MapK,V 中的 forEach

參數(shù):

參數(shù)名稱 參數(shù)描述
action 為每個條目執(zhí)行的操作

replaceAll

public void replaceAll(BiFunction<? super K,? super V,? extends V> function)

從接口復(fù)制的描述:地圖

將每個條目的值替換為對該條目調(diào)用給定函數(shù)的結(jié)果,直到所有條目都已處理或該函數(shù)引發(fā)異常。 函數(shù)拋出的異常被轉(zhuǎn)發(fā)給調(diào)用者。

指定者:

接口 MapK,V 中的 replaceAll

參數(shù):

參數(shù)名稱 參數(shù)描述
function 應(yīng)用于每個條目的函數(shù)

clone

public Object clone()

返回此 HashMap 實(shí)例的淺表副本:鍵和值本身沒有被克隆。

覆蓋:

在類 AbstractMapK,V 中克隆

返回:

這個 map 的淺拷貝

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號