跳轉到內容

地圖

75% developed
來自華夏公益教科書

導航 聚合 主題: v  d  e )


除了 java.util.Collection 介面,Java JDK 還有 java.util.Map 介面。它有時也被稱為關聯陣列字典。地圖定義了鍵值對映。Map 介面的實現不包含物件集合。相反,它們包含鍵->值對映集合。可以將其視為一個數組,其中索引不需要是整數。

Example 程式碼部分 5.17:地圖的使用。
import java.util.Map;
import java.util.Hashtable;
...
Map map = new Hashtable();
...
map.put(key, value);

如果你需要在一個 Map 中將相關物件放在一起,其中你可以

  • 透過鍵物件訪問元素
  • 將一個物件對映到另一個


圖 5.6:地圖介面。


java.util.Map<K,V>
將鍵對映到值。地圖不能包含重複的鍵;每個鍵最多可以對映到一個值。Map 介面提供了三個集合檢視,允許將地圖的內容視為鍵集、值集合或鍵值對映集。鍵通常是不可變物件。但是,值物件可以是可變物件。
java.util.SortedMap<K,V>
與 Map 介面相同,另外地圖中的鍵已排序。

在上面的示例中,相同的操作使用兩個不同的地圖實現完成

Computer code 程式碼清單 5.4:MapImplementations.java
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * Compare the map implementations.
 *
 * @author xxx
 */
public class MapImplementations {

  /**
   * Compare the map implementations.
   * @param args The execution parameters.
   */
  public static void main(String[] args) {
    processMap(new LinkedHashMap<String, Integer>());

    processMap(new TreeMap<String, Integer>());
  }

  /**
   * Use a map:
   * 1. Fill the map with key-> value.
   * 2. Print all the keys.
   *
   * @param map The used map.
   */
  public static void processMap(Map<String, Integer> map) {
    System.out.println("Process the map");
    map.put("3", new Integer(3));
    map.put("2", new Integer(2));
    map.put("1", new Integer(1));

    for (String key : map.keySet()) {
      System.out.println(key);
    }
  }
}
Standard input or output 程式碼清單 5.4 的控制檯
Process the map
3
2
1
Process the map
1
2
3

我們看到只有 TreeMap 對鍵進行了排序。注意泛型。Map 介面很棘手。get()remove() 方法不是泛型的。這意味著你必須注意鍵的型別

Example 程式碼部分 5.18:棘手的泛型。
Map<Integer, String> map = new TreeMap<Integer, String>();

map.put(new Integer(1), "Watch");
map.put(new Integer(2), "out");
map.put(new Integer(3), "!");

map.remove("2");

for (String value : map.values()) {
  System.out.println(value);
}
Standard input or output 程式碼部分 5.18 的控制檯
Watch
out
!

remove() 呼叫沒有做任何事情,因為 "2" 是一個 String,而不是一個 Integer,因此沒有找到並刪除任何鍵值對。

地圖類

[編輯 | 編輯原始碼]

Map 介面有以下實現


圖 5.7:地圖類圖。


java.util.TreeMap<E>
保證地圖將按升序鍵排序,根據鍵類的自然順序排序,非同步。
java.util.Hashtable<E>
同步,null 不能用作鍵
java.util.HashMap<E>
大致相當於 Hashtable,除了它是非同步的並且允許 null
java.util.concurrent.ConcurrentHashMap
與 Hashtable 相同,另外檢索操作(包括 get)通常不會阻塞,因此可能與更新操作(包括 put 和 remove)重疊。
java.util.WeakHashMap<E>
WeakHashMap 中的條目將在其鍵不再正常使用時自動刪除。非同步。
java.util.LinkedHashMap<E>
此連結串列定義了迭代順序,通常是鍵首次插入地圖的順序(首次插入順序)。注意,如果將鍵重新插入地圖,插入順序不會受到影響。
java.util.IdentityHashMap
此類使用雜湊表實現 Map 介面,在比較鍵(和值)時使用引用相等代替物件相等。換句話說,在 IdentityHashMap 中,兩個鍵 k1 和 k2 被認為相等,當且僅當 if (k1==k2)。(在正常的 Map 實現(如 HashMap)中,兩個鍵 k1 和 k2 被認為相等,當且僅當 if (k1==null ? k2==null : k1.equals(k2))。)非同步。
java.util.EnumMap
EnumMap 中的所有鍵必須來自建立地圖時顯式或隱式指定的單個列舉型別。EnumMap 在內部表示為陣列。這種表示非常緊湊且高效。非同步。

執行緒安全地圖

[編輯 | 編輯原始碼]

下表列出了所有同步的地圖類

同步 非同步
java.util.TreeMap
java.util.Hashtable

java.util.concurrent.ConcurrentHashMap

java.util.HashMap
java.util.LinkedHashMap
java.util.IdentityHashMap
java.util.EnumMap


Clipboard

待辦事項
新增一些與 變數 中相同的練習


華夏公益教科書