Map與Map.Entry的區別
Map與Map.Entry的區別
Map:鍵值對的集合
Map 的創建與本質
Map 是一種用于存儲鍵值對(key-value)的數據結構。每個鍵都是唯一的,它映射到一個對應的值。
// 使用泛型創建一個 Map,例如鍵為 String 類型,值為 Integer 類型
Map<String, Integer> map = new HashMap<>();
它的核心思想就像一本字典:通過“單詞”(key)可以快速查到它的“釋義”(value)。
Map 的無序性
大多數 Map 的實現(如 HashMap)不保證元素的存儲順序。你放入元素的順序,和遍歷時取出的順序,通常是不一致的。這種設計是為了優化查找速度。
因此,不能直接對 Map 本身進行排序。
對 Map 進行排序的標準流程
要對 Map 的內容進行排序,我們需要一個“中轉站”,這個中轉站就是 List。標準流程如下:
- 提取鍵值對:使用
map.entrySet()方法,將 Map 中的所有鍵值對提取出來,形成一個Set集合。 - 轉換為 List:將這個
Set轉換為一個List,因為List是有序的,并且支持排序。 - 自定義排序:使用
Collections.sort()或List.sort()方法,并提供一個自定義的比較器Comparator來定義排序規則。
// 1. 將 Map 的所有鍵值對轉換成一個 List
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
// 2. 使用 Collections.sort() 對 List 進行排序
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
// 先按值 降序 排列
int valueCompare = o2.getValue().compareTo(o1.getValue());
if (valueCompare != 0) {
return valueCompare;
}
// 如果值相同,再按鍵 升序 排列
return o1.getKey().compareTo(o2.getKey());
}
});
// 現在的 list 就是有序的了,可以按順序遍歷輸出
for (Map.Entry<String, Integer> entry : list) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
上面的代碼可以用更簡潔的 Lambda 表達式來寫:
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
list.sort((e1, e2) -> {
int valueCompare = e2.getValue().compareTo(e1.getValue());
if (valueCompare != 0) {
return valueCompare;
}
return e1.getKey().compareTo(e2.getKey());
});
在排序后的 list 中,數據就像 [ (key1, value1), (key2, value2), ... ] 這樣有序地存儲。
Map.Entry:鍵值對的“名片”
功能
Map.Entry 是 Map 接口內部的一個嵌套接口。它不是 Map 本身,而是 Map 中單個鍵值對的表示。
你可以把它想象成一張“名片”或一個“包裹”,這張名片上清晰地寫著:
- getKey(): 獲取鍵
- getValue(): 獲取值
- Key.setValue(value): 設置值(注意,這個操作會直接修改原始 Map 中對應的值)
Map.Entry的作用
正因為 Map.Entry 可以將一個鍵和一個值捆綁成一個獨立的對象,我們才能將它放入 List 中,并基于它的 key 或 value 來編寫自定義的排序邏輯。沒有它,我們就無法方便地對 Map 的內容進行排序。

浙公網安備 33010602011771號