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

HashMap 與 HashSet 核心差異深度解析

     編輯:Java 相關知識

定位差異

HashMap 實作 Map<K,V>,存儲「鍵值對」;HashSet 實作 Set<E>,存儲「唯一元素」。底層 HashSet 直接包裝 HashMap(private transient HashMap<E,Object> map),以元素為 Key,固定虛擬值 PRESENT 為 Value。

核心差異對比表

維度HashMapHashSet
介面MapSet
存儲結構Key-Value 鍵值對單一元素
新增方法put(K key, V value)add(E e)
重複判斷Key 唯一(hashCode() + equals())元素唯一(同理)
Null 支援1 個 null Key,多個 null Value1 個 null 元素
查詢效能O(1) 直接定位 KeyO(1) 但需轉換為 Map 查詢
遍歷方式entrySet()、keySet()、values()iterator()、增強 for

底層原理深度剖析

HashSet 去重邏輯

public boolean add(E e) {
    return map.put(e, PRESENT) == null; // put 返回舊值,null 表示新增成功
}

因此 HashSet 去重完全依賴元素正確覆寫 hashCode() 與 equals()。若未覆寫,預設 Object 實作比較記憶體地址,導致「內容相同但物件不同」被視為不同元素。

HashMap Key 設計最佳實踐

  • 使用不可變物件(String、Integer 等包裝類)
  • 覆寫 hashCode() 與 equals() 保持一致性契約
  • 避免作為 Key 的物件在放入後修改關鍵欄位(導致找不到)

效能與選型建議

  • 需「鍵值映射」→ HashMap
  • 需「唯一集合、去重」→ HashSet
  • 需「保持插入序」→ LinkedHashMap / LinkedHashSet
  • 需「排序」→ TreeMap / TreeSet
  • 多線程高併發→ ConcurrentHashMap / CopyOnWriteArraySet

面試加分點

  1. 說出 HashSet 底層包裝 HashMap,並解釋 PRESENT 虛擬值設計
  2. 分析 hashCode() 碰撞時,HashMap 鏈表/紅黑樹如何配合 equals() 精確定位
  3. 對比 HashSet.add() vs ArrayList.contains() 時間複雜度:O(1) vs O(n)

總結

HashMap 與 HashSet 雖同屬集合框架、同基於雜湊表,但定位截然不同:前者解決「映射」,後者解決「去重」。理解兩者底層關聯與契約,是寫出高效、正確 Java 代碼的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved