Map是什么
Map
用來存放鍵值對數據,可以看做是鍵值對的集合。
Map
不能包含重復的鍵,也就意味著每個鍵只能映射到最多一個值。Map
沒有規定不能存放為null
的值。
Java平臺提供三種通用的Map
實現類:HashMap
, TreeMap
, LinkedHashMap
。三者的行為和性能可以類比HashSet
,TreeSet
,LinkedHashSet
。
Map提供的接口
作為一個集合,自然是需要提供增刪改查這類接口。來看看Map
都提供了什么:
- 添加修改操作:
對于// 向Map中添加或者更新值。返回先前映射的元素,或者null,如果不存在。 public V put(K key, V value); public void putAll(Map<? extends K,? extends V> map);
put
操作,如果Map
已經包含了當前的key
,則會用更新原有值為新的value
。 - 刪除操作:
// 返回被刪除的元素,或者如果該元素不存在則返回null public V remove(Object key); public void clear();
- 查詢操作:
// 返回Map中鍵值對個數 public int size(); // 返回key映射的值,如果不存在則返回null V get(Object key); /** * 返回包含的鍵的集 * 注意:返回的Set不支持添加操作。并且修改返回的Set或者原有Map將會相互影響 */ public Set<K> keySet(); /** * 返回包含的所有值的集合 * 注意:修改原有Map或者返回的集合將會相互影響。 * 返回的集合支持remove, removeAll, retainAll以及clear操作,不支持add, addll操作。 */ public Collection<V> values(); /** * 返回一個包含所有映射內容的集形式,每條映射內容保存于Entry中 * 同樣修改返回的Set或者原有Map將會相互影響 */ public Set<Map.Entry<K,V>> entrySet();
- 測試操作:
public boolean containsKey(Object key); public boolean containsValue(Object value); public boolean isEmpty(); public boolean equals(Object object);
- 其他:
public int hashCode();
查詢操作里面,keySet()
,entrySet()
,values()
方法返回了Map
的集合視圖,可以方便使用Collection
接口形式進行操作。
另外,所有的通用Map
實現都提供將Map
作為參數的構造函數,類似Collection
,這將很方便的用于拷貝生成一個新的Map
實現,而不用考慮以前的實現類型。
基本操作的例子
下面的例子用來統計參數表中的每個詞出現的次數,并保存在Map中。
package com.shane.collection;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Shane on 2016/6/25.
*/
public class Freq {
public static void main(String[] args) {
Map<String, Integer> m = new HashMap<String, Integer>();
// Initialize frequency table from command line
for (String a : args) {
Integer freq = m.get(a);
m.put(a, (freq == null) ? 1 : freq + 1);
}
System.out.println(m.size() + " distinct words:");
System.out.println(m);
}
}
上面唯一需要注意的就是通過判斷freq
是否等于null,來確定是不是第一次添加,因為等Map中沒有包含某個key時,返回的值為null。
在命令行下,切換到編譯后的class文件最頂層,執行下面的命令:
java com.shane.collection.Freq if it is to be it is up to me to delegate
注意,這里com.shane.collection
為Freq
類所在的包。
測試結果如下:
// HashMap
8 distinct words:
{delegate=1, be=1, me=1, is=2, it=2, to=3, up=1, if=1}
// TreeMap
8 distinct words:
{be=1, delegate=1, if=1, is=2, it=2, me=1, to=3, up=1}
// LinkedHashMap
8 distinct words:
{if=1, it=2, is=2, to=3, be=1, up=1, me=1, delegate=1}
通過傳入不同的Map
實現,可以得到不同的結果。可以看到TreeMap
以字母順序返回結果,LinkedHashMap
則以第一次出現的單詞的先后順序返回。這也印證了它們各自的特性。
多值Map(Multimaps)
這里指的是一個Map,可以映射每個key到多個values。Java集合框架并沒有包含一個接口用于多值Map,主要是因為這個并不是那么常用。通常利用將一個key映射到一個List來達到多值映射的目的。
比如:
Map<String, List<String>> = new HashMap<String, List<String>>;