1. 一組鍵值對。
在 Java 中,另一個有趣的集合(從廣義上講)是Map
. 有時這種數據結構也稱為字典。
它類似於集合Set
,但它存儲一組“對”元素而不是一組元素,a 中的每一對Map
由兩個元素組成:一個“鍵”和一個“值”。
假設您希望您的程序存儲員工姓名和他們的薪水,或者您同事的姓名和他們的年齡。那麼你需要一個這樣的表:
姓名 | 年齡 |
---|---|
埃隆 | 21 |
傑夫 | 22 |
賬單 | 48歲 |
沃倫 | ? |
每行包含幾個值。我們將把名字稱為對的鍵,將年齡稱為對的值。
這些對的整個集合就是我們的映射( Map
)。
一對的密鑰可以是除null
. 鍵必須是唯一的:一個映射不能包含兩個相同的鍵。
2.HashMap
類
類HashMap
是最受歡迎的一種Map
集合。一方面,它與 HashSet 非常相似並且擁有它的所有方法。另一方面,它就像一個列表 ( ArrayList
),可以使用單詞(或其他任何東西)作為其索引。
您可以HashMap
使用這樣的語句創建一個:
HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();
其中KeyType
是存儲對中鍵的類型,ValueType
是存儲在集合中的對中值的類型HashMap
。
該類HashMap
有這樣的方法:
方法 | 描述 |
---|---|
|
將 ( key , value ) 對添加到集合中 |
|
返回與鍵關聯的值。 |
|
檢查集合中是否存在鍵 |
|
檢查集合中是否存在某個值 |
|
從集合中移除一個元素 |
|
清除集合,刪除所有元素 |
|
返回集合中鍵值對的數量 |
|
返回集合中的鍵集 |
|
返回包含集合元素的集合 |
|
返回集合中Set 所有對 ( ) 的集合 ( )。Map.Entry |
將元素添加到HashMap
使用該方法將元素成對添加到地圖中put()
。鍵作為第一個參數傳遞,值作為第二個參數傳遞。
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);
添加鍵值對時,如果鍵已經存在於集合中,則舊值被新值替換。
這種行為使 aHashMap
類似於數組或列表,其索引是單詞 ( String
) 而不是數字。
幾乎任何類型都可以是 KeyType 或 ValueType。KeyType 有一些小的附加要求,當您在 Java Collections 任務中更詳細地研究集合時,您將了解這些要求。
3. Subsets of a HashMap
: 鍵集
假設我們只想HashMap
在屏幕上顯示 a 中的所有條目。我們如何做到這一點?為此,我們需要知道如何遍歷HashMap
. 這可以通過多種方式完成。
最簡單的方法是遍歷鍵
HashMap
條目沒有按順序編號,因此帶計數器的循環在這裡不起作用。但是我們可以使用該方法獲取一組鍵keySet()
,並且您已經知道如何迭代一組:
代碼 | 描述 |
---|---|
|
循環遍歷的鍵獲取 map 與鍵關聯的值 |
該keySet()
方法返回一組鍵。您可以通過兩種方式使用此集合:
緊湊的符號 | 長符號 |
---|---|
|
|
4.循環鍵值對
還有一種更複雜的方法:可以將 a 轉換Map
為一組鍵值對,然後循環遍歷該集合的元素,我們已經學過。
該HashMap
集合有一個存儲鍵值對的輔助類。它看起來大約是這樣的:
class Entry<KeyType, ValueType>
{
private KeyType key;
private ValueType value;
public KeyType getKey()
{
return this.key;
}
public ValueType getValue()
{
return this.value;
}
}
entrySet()
在對像上調用該方法的結果將是:HashMap<KeyType, ValueType>
Set<Entry<KeyType, ValueType>>
Set<Entry<KeyType, ValueType>> name = map.entrySet();
這裡我們有Set
一個帶有類型參數的泛型類,它又是一個Entry
帶有兩個類型參數的泛型類型 ( )。
初學者很容易對此感到困惑。但是一旦你弄明白了,你就可以編寫如下代碼:
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
也就是說,這段代碼可以稍微簡化一下:
首先,您可以跳過為 for 創建單獨的變量entries
,而是entrySet()
直接在for
循環內調用該方法:
for(Map.Entry<String, Integer> pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
其次,您可以使用最近推出的運算符來自動推斷鍵值對var
的類型:
for(var pair: map.entrySet())
{
String key = pair.getKey();
Integer value = pair.getValue();
System.out.println(key + " --> " + value);
}
還不錯吧?
ArrayList
5.和的比較HashMap
A 與允許將字符串(或其他類型)用作索引(鍵)的HashMap
非常相似。ArrayList
如果您使用Integer
a 中的鍵HashMap
,那麼它會變得更加類似於ArrayList
. 讓我們比較一下:
使用 ArrayList<String> 的代碼 | 使用 HashMap<Integer, String> 的代碼 |
---|---|
|
|
GO TO FULL VERSION