java基礎:Map


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接口的一個實現。因此,不論映射內部順序如何,兩個相等映射會報告相同的散列碼。


發佈了37 篇原創文章 · 獲贊 11 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章