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

【Java每日一題】HashMap 遍歷方式輸出順序分析

     編輯:Java 綜合教學

【Java每日一題】HashMap 遍歷方式輸出順序分析

今天來看一道經典的 HashMap 遍歷順序題目,考察對 HashMap 無序特性及兩種遍歷方式的理解。

題目代碼

public class Ques1101 {
    public static void main(String[] args) {
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < 100; i++) {
            map.put(i, i);
        }
        // 遍歷 1:keySet
        for (Integer key : map.keySet()) {
            Integer value = map.get(key);
            System.out.println(key + "---" + value);
        }
        // 遍歷 2:entrySet
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            Integer key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key + "---" + value);
        }
    }
}

核心考點解析

  1. HashMap 無序性:基於哈希表,存儲位置由 key 的 hashCode() 決定,**不保證任何順序**(插入順序、自然順序、訪問順序均不保證)。
  2. 遍歷 1:keySet + get()
    • 先獲取所有 Key 組成的 Set 視圖
    • 遍歷 Key,每次調用 map.get(key) 查找 Value
    • 性能較差:N 次遍歷 + N 次哈希查找 = 2N 次操作
  3. 遍歷 2:entrySet(推薦)
    • 直接獲取 Map.Entry<K,V> 集合視圖
    • 單次遍歷同時獲得 Key/Value,**無額外查找開銷**
    • 性能優於方式 1,是標準遍歷姿勢
  4. 輸出順序:兩種方式**輸出順序完全一致**,均為 HashMap 內部桶位遍歷順序(表現為看似隨機的無序序列)。JDK 8+ 引入紅黑樹後,大數據量下順序受樹結構影響,但仍屬「不可預期順序」。

運行結果預期

輸出 100 行 "i---i" (i=0..99),順序非 0,1,2...99
例如:
12---12
3---3
89---89
...
(兩段輸出順序完全相同)

進階補充:JDK 8 優化與 LinkedHashMap

  • JDK 8:鏈表長度 > 8 且數組長度 >= 64 時轉紅黑樹,遍歷順序變為中序遍歷,但仍**不保證業務語義順序**。
  • 需保持插入順序:使用 LinkedHashMap(雙向鏈表維護順序)。
  • 需按 Key 排序:使用 TreeMap(紅黑樹,Key 需實現 Comparable 或提供 Comparator)。
  • Lambda 遍歷 (JDK 8+):map.forEach((k,v) -> System.out.println(k+"---"+v)); 底層仍走 entrySet,代碼更簡潔。

面試延伸問題

  1. HashMap 為什麼不保證順序?
  2. keySet 遍歷為什麼效率低?如何優化?
  3. ConcurrentHashMap 遍歷是否安全?弱一致性含義?
  4. 如何實現一個「插入有序、支持高併發」的 Map?

每日一題,堅持精進! 關注公眾號/簡書獲取更多題目解析。

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