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有這樣的方法:

方法 描述
void put(KeyType key, ValueType value)
將 ( key, value) 對添加到集合中
ValueType get(KeyType key)
返回與鍵關聯的值。
boolean containsKey(KeyType key)
檢查集合中是否存在鍵
boolean containsValue(ValueType value)
檢查集合中是否存在某個值
ValueType remove(KeyType key)
從集合中移除一個元素
void clear()
清除集合,刪除所有元素
int size()
返回集合中鍵值對的數量
Set<KeyType> keySet()
返回集合中的鍵集
Collection<ValueType> values()
返回包含集合元素的集合
Set<Map.Entry<KeyType, ValueType>> entrySet()
返回集合中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(),並且您已經知道如何迭代一組:

代碼 描述
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}






循環遍歷的鍵獲取map

與鍵關聯的值

keySet()方法返回一組鍵。您可以通過兩種方式使用此集合:

緊湊的符號 長符號
for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}
Set<String> keys = map.keySet();

for (String key: keys)
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}


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);
}

還不錯吧?



ArrayList5.和的比較HashMap

A 與允許將字符串(或其他類型)用作索引(鍵)的HashMap非常相似。ArrayList

如果您使用Integera 中的鍵HashMap,那麼它會變得更加類似於ArrayList. 讓我們比較一下:

使用 ArrayList<String> 的代碼 使用 HashMap<Integer, String> 的代碼
ArrayList<String> list = new ArrayList<String>();

list.add("Greetings");
list.add("Hello");

String s = list.get(0);
list.set(0, s + "!");

for (String item: list)
{
   System.out.println(item);
}
HashMap<Integer, String> map = new HashMap<Integer, String>();

map.put(0, "Greetings");
map.put(1, "Hello");

String s = map.get(0);
map.put(0, s + "!");

for (String item: map.values())
{
   System.out.println(item);
}