首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java HashMap keySet() 視圖特性與刪除操作實例

     編輯:Java 程式設計入門

核心概念

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

常見陷阱與最佳實務

  1. 遍歷中刪除:請使用 Iterator 或 keySet.removeIf(predicate) (Java 8+)。
  2. 序列化:keySet() 回傳的 Set 不可序列化(非實作 Serializable),需轉 new HashSet<>(map.keySet())。
  3. 效能:視圖操作委派給 Map,contains() 為 O(1),但 toArray()、size() 會遍歷內部表格。
  4. 並發:非執行緒安全,多執行緒請用 ConcurrentHashMap.keySet()(同為視圖,但支援並發讀寫)。

進階:Java 8+ 風格寫法

// 移除值大於 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);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved