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

Java 中 HashMap 與 TreeMap 核心區別深度解析

     編輯:Java 程式設計入門

Map 基礎概念

Map 是鍵值對集合,通過 Key 索引 Value。Java 提供多種實現,最常用的是 HashMap(哈希表)與 TreeMap(紅黑樹)。

類層級結構

  • HashMap 繼承 AbstractMap,實現 Map 接口。
  • TreeMap 繼承 AbstractMap,實現 NavigableMap(繼承 SortedMap)。

核心區別對比

特性HashMapTreeMap
底層數據結構哈希表(數組+鏈表/紅黑樹)紅黑樹(自平衡二叉搜索樹)
元素順序無序,不保證迭代順序按 Key 自然順序或 Comparator 排序
Key 要求正確重寫 hashCode() 與 equals()Key 需實現 Comparable 或提供 Comparator
線程安全非線程安全非線程安全
性能特點增刪查 O(1) 平均增刪查 O(log n),適合有序遍歷
調優參數初始容量、負載因子無(樹自平衡)
Null Key 支持允許一個 null key不允許 null key(比較會拋 NPE)

構造方法概覽

HashMap

  • HashMap()
  • HashMap(Map<? extends K, ? extends V> m)
  • HashMap(int initialCapacity)
  • HashMap(int initialCapacity, float loadFactor)

TreeMap

  • TreeMap()
  • TreeMap(Map<? extends K, ? extends V> m)
  • TreeMap(Comparator<? super K> comparator)
  • TreeMap(SortedMap<K, ? extends V> m)

代碼演示:順序差異

Map<String, String> hashMap = new HashMap<>();
hashMap.put("a", "aaa"); hashMap.put("b", "bbb"); hashMap.put("c", "ccc"); hashMap.put("d", "ddd");
// 輸出順序不固定,例:ddd, bbb, ccc, aaa

TreeMap<String, String> treeMap = new TreeMap<>();
treeMap.put("a", "aaa"); treeMap.put("b", "bbb"); treeMap.put("c", "ccc"); treeMap.put("d", "cdc");
// 輸出嚴格按 Key 排序:aaa, bbb, ccc, cdc

HashMap 核心原理與 hashCode/equals 契約

HashMap 通過 hashCode() 確定桶位置,再用 equals() 精確匹配。若 Key 未正確重寫這兩個方法,會導致「明明 put 了卻 get 不到」的問題。

錯誤示例

class Element { int number; Element(int n) { number = n; } }
// 未重寫 hashCode/equals,預設使用 Object 內存地址
Map<Element, Figureout> map = new HashMap<>();
map.put(new Element(5), new Figureout());
Element test = new Element(5);
map.containsKey(test); // false!因為兩個 Element 實例 hashCode 不同

正確重寫

class Element {
    int number;
    Element(int n) { number = n; }
    @Override public int hashCode() { return number; }
    @Override public boolean equals(Object o) {
        return o instanceof Element && number == ((Element)o).number;
    }
}

重寫 hashCode 兩大原則

  1. 不為一原則:不必為每個不同對象產生唯一 hashCode,只需保證 equals 為 true 時 hashCode 相等。
  2. 分散原則:hashCode 值盡量均勻分佈,減少哈希碰撞,提升性能。

總結建議

  • 默認優先使用 HashMap,性能更優。
  • 需要有序遍歷、範圍查詢(subMap、headMap、tailMap)時選 TreeMap。
  • 多線程環境下考慮 ConcurrentHashMap 或 Collections.synchronizedMap。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved