Map接口
Map接口是一個獨立的接口,沒有繼承Collection接口;接口描述了從不重複的鍵到值的映射。
Map接口中的方法分爲五類:查詢,修改,塊操作,提供視圖,比較和希哈
public interface Map<K,V> {
// 查詢
int size();
boolean isEmpty();
boolean containsKey(Object key);
boolean containsValue(Object value);
V get(Object key);
// 修改
V put(K key, V value);
V remove(Object key);
// 塊操作
void putAll(Map<? extends K, ? extends V> m);
void clear();
// 視圖
Set<K> keySet(); // 因爲key值不允許重複,所以用Set
Collection<V> values(); // 而value值是允許重複的,所以用Collection
Set<Map.Entry<K, V>> entrySet(); // Map 的 entrySet() 方法返回一個實現 Map.Entry 接口的對象集合。集合中每個對象都是底層 Map 中一個特定的鍵-值對。
interface Entry<K,V> {//詳細介紹:http://zhidao.baidu.com/question/32679780.html
K getKey();
V getValue();
V setValue(V value);
boolean equals(Object o);
int hashCode();
}
// 比較 希哈
boolean equals(Object o);
int hashCode();
}
對於Map接口,在“集合框架”中也有兩個常規實現類,和Set接口類似,他們是:
HashMap類
更適合在Map
中插入、刪除和定位元素。
使用HashMap
要求添加的鍵類明確定義了hashCode()
實現。
TreeMap類
適合按順序遍歷鍵。
有了TreeMap
實現,添加到映射的元素一定是可排序的。
實例:
public class Demo {
public static void main(String[] args) throws Exception {
String[] arg={"zhang","jin","yu","is","zhang","yun","yuan's","borather","and","is","wang","qi's","husband"};
Map map=new HashMap<>();
Integer ONE=new Integer(1);
for(int i=0, n=arg.length; i<n; i++){
String key=arg[i];
Integer frequency=(Integer)map.get(key);
if(frequency==null){
frequency=ONE;
}else{
int value=frequency.intValue();
frequency=new Integer(value+1);
}
map.put(key, frequency);
}
System.out.println(map);
Map sorted_map=new TreeMap(map);
System.out.println(sorted_map);
}
}
運行結果:
{jin=1, is=2, yu=1, qi's=1, yuan's=1, zhang=2, yun=1, borather=1, husband=1, wang=1, and=1}
{and=1, borather=1, husband=1, is=2, jin=1, qi's=1, wang=1, yu=1, yuan's=1, yun=1, zhang=2}
結果分析:
當map中已經有一個Key爲“zhang”時,再往其中添加Key值爲“zhang”的key-value對會覆蓋之前的。
爲了優化HashMap
空間的使用,可以調優初始容量和負載因子。這個TreeMap
沒有調優選項,因爲該樹總處於平衡狀態(和Set中一樣)。
AbstractMap類(抽象類)
AbstrctMap類也覆蓋了equals()
和hashCode()
方法,以確保兩個相等映射返回相同的散列碼。如果兩個映射大小相等、包含同樣的鍵且每個鍵在這兩個映射中對應的值都相同,則這兩個映射相等。按定義,映射的散列碼是映射元素散列碼的總和,其中每個元素是Map.Entry
接口的一個實現。因此,不論映射內部順序如何,兩個相等映射會報告相同的散列碼。