Map介面
Map是一個將鍵映射為值的對象。一個映射不能包含重複鍵:每個鍵最多能映射一個值。Map介面如下所示:
public interface Map {
// Basic Operations
Object put(Object key, Object value);
Object get(Object key);
Object remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
// Bulk Operations
void putAll(Map t);
void clear();
// Collection Views
public Set keySet();
public Collection values();
public Set entrySet();
// Interface for entrySet element
public interface Entry {
Object getKey();
Object getValue();
Object setValue(Object value);
}
}
JDK包含兩個新的通用Map實現,一個是HashMap, 它將它的項儲存在一個雜湊表中,是一種最好的實現;另一個是TreeMap, 它將它的項儲存在一個紅-黑樹上,它可保證迭代的順序。另外, Hashtable已被改進以實現Map。
與雜湊表的比較
如果你使用過Hashtable, 你應該已經熟悉了Map的一般風格(當然Map是一個介面,而Hashtable是一個具體的實現)。以下是它們的主要區別:
Map提供Collection視圖,作為Enumeration對象的替代直接支援迭代過程。Collection視圖 極大地提高了介面的可表達性,正如後續課程將講到的。
Map允許你在鍵、值或鍵-值對上進行迭代;Hashtable則不提供第三個選項。
Map提供了在迭代過程中刪除項的安全途徑;Hashtable則不能。
進一步講,Map修補了Hashtable介面上的某些小缺陷。Hashtable具有一個稱作contains的方法,如果Hashtable包含一個給定值,它將返回true。從它的名字上理解, 你可能期望如果Hashtable包含一個給定的key, 這個方法也會返回一個true ,因為鍵是一個Hashtable的主要存取機制。Map介面通過將這個方法重新命名為containsValue,從而消除了引起混亂的來源;同時也改善了介面的一致性: containsValue與containsKey可很好地對應並行。
基本操作
基本操作 (put, get, remove, containsKey, containsValue, s , a和isEmpty) 的功能與它們在Hashtable中的對等物非常相似。下面的簡單程式針對參數列表中的詞彙產生一個頻率表。頻率表將每個詞和它在參數列表中所出現的次數相映射。
import java.util.*;
public class Freq { private static final Integer ONE = new Integer(1);
public static void main(String args[]) {
Map m = new HashMap();
// Initialize frequency table from command line
for (int i=0; i$#@60; args.length; i++) {
Integer freq = (Integer) m.get(args[i]);
m.put(args[i], (freq==null ? ONE :
new Integer(freq.intValue() + 1)));
}
System.out.println(m.size()+" distinct words detected:");
System.out.println(m);
}
}