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

Java Map.Entry 實現原理:HashMap 內部靜態類 Node 實作 Entry 介面

     編輯:程式設計綜合問答

核心結構


// Map 介面定義
public interface Map {
    interface Entry { // 靜態巢狀介面
        K getKey();
        V getValue();
        // ...
    }
    Set> entrySet();
}

// HashMap 實作 (JDK 8+)
public class HashMap extends AbstractMap implements Map {
    // 內部節點類別,實作 Map.Entry
    static class Node implements Map.Entry {
        final int hash;
        final K key;
        V value;
        Node next;

        Node(int hash, K key, V value, Node next) {
            this.hash = hash; this.key = key; this.value = value; this.next = next;
        }

        public final K getKey() { return key; }
        public final V getValue() { return value; }
        public final V setValue(V newValue) {
            V old = value;
            value = newValue;
            return old;
        }
        // equals/hashCode/toString 省略...
    }

    // entrySet() 回傳包裝 Set
    public Set> entrySet() {
        return new EntrySet(); // 內部類別,迭代遍歷 table 中的 Node
    }
}

為何 Entry 定義為靜態介面?

  1. 語意上獨立:`Map.Entry` 代表「鍵值對」這一**抽象概念**,不依賴具體 `Map` 實例狀態。
  2. 避免隱含外部類別引用**:非靜態內部介面/類別會隱含持有外部實例引用,增加記憶體負擔且序列化麻煩。
  3. 多實作共用**:`HashMap.Node`、`TreeMap.Entry`、`LinkedHashMap.Entry` 皆實作同一 `Map.Entry`,呼叫端可統一型別處理。

誰實作 getKey()/getValue()?

**各 Map 實作類別的內部節點類別** (如 `HashMap.Node`、`TreeMap.Entry`)。`entrySet()` 迭代器遍歷內部表格,將每個節點**作為 `Map.Entry` 型別回傳**,呼叫端多型調用 `getKey()`/`getValue()` 實際執行節點類別的實作。

遍歷範例


Map map = new HashMap<>();
map.put("A", 1); map.put("B", 2);

for (Map.Entry entry : map.entrySet()) {
    System.out.println(entry.getKey() + "=" + entry.getValue());
    // 實際執行 HashMap.Node.getKey()/getValue()
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved