HashMap.keySet() 回傳 Set<K>,此 Set 為 視圖,直接反映 Map 內部鍵集合。對 Set 的修改(如 remove())會同步影響原 Map,反之亦然。
import java.util.HashMap;
import java.util.Set;
public class HashMapKeySetDemo {
public static void main(String[] args) {
HashMap<Integer, Integer> map = new HashMap<>();
map.put(1, 1);
map.put(2, 4);
map.put(3, 9);
map.put(4, 16);
Set<Integer> keySet = map.keySet();
System.out.println("修改前 Map size: " + map.size()); // 4
// 透過 keySet 移除鍵 3
boolean removed = keySet.remove(3);
System.out.println("keySet.remove(3) 回傳: " + removed); // true
System.out.println("修改後 Map size: " + map.size()); // 3
System.out.println("Map 剩餘鍵: " + map.keySet()); // [1, 2, 4]
}
}
| 操作 | keySet 視圖 | 原 Map | 備註 |
|---|---|---|---|
keySet.remove(key) | 移除成功回傳 true | 對應 Entry 被刪除 | 支援 removeIf()、clear() |
keySet.add(key) | 拋 UnsupportedOperationException | 不變 | Map 需值,Set 無法單獨加鍵 |
map.put(newKey, val) | 自動出現新鍵 | 新增 Entry | 視圖即時同步 |
map.remove(key) | 自動消失該鍵 | 刪除 Entry | 視圖即時同步 |
迭代器 iterator.remove() | 安全移除 | 同步刪除 | for-each 循環中不可直接 map.remove(),否則 ConcurrentModificationException |
Iterator 或 keySet.removeIf(predicate) (Java 8+)。keySet() 回傳的 Set 不可序列化(非實作 Serializable),需轉 new HashSet<>(map.keySet())。contains() 為 O(1),但 toArray()、size() 會遍歷內部表格。ConcurrentHashMap.keySet()(同為視圖,但支援並發讀寫)。// 移除值大於 10 的鍵
map.keySet().removeIf(k -> map.get(k) > 10);
// 收集所有鍵為 List(可序列化)
List<Integer> keys = new ArrayList<>(map.keySet());
// 串流處理
map.keySet().stream()
.filter(k -> k % 2 == 0)
.forEach(System.out::println);