Map是什么
Map
用來存放鍵值對數(shù)據(jù)翎朱,可以看做是鍵值對的集合。
Map
不能包含重復的鍵,也就意味著每個鍵只能映射到最多一個值痹换。Map
沒有規(guī)定不能存放為null
的值恰梢。
Java平臺提供三種通用的Map
實現(xiàn)類: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
已經(jīng)包含了當前的key
垮卓,則會用更新原有值為新的value
垫桂。 - 刪除操作:
// 返回被刪除的元素,或者如果該元素不存在則返回null public V remove(Object key); public void clear();
- 查詢操作:
// 返回Map中鍵值對個數(shù) 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
實現(xiàn)都提供將Map
作為參數(shù)的構造函數(shù),類似Collection
舶斧,這將很方便的用于拷貝生成一個新的Map
實現(xiàn)欣鳖,而不用考慮以前的實現(xiàn)類型。
基本操作的例子
下面的例子用來統(tǒng)計參數(shù)表中的每個詞出現(xiàn)的次數(shù)茴厉,并保存在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文件最頂層蜕依,執(zhí)行下面的命令:
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
實現(xiàn)样眠,可以得到不同的結果〈渲猓可以看到TreeMap
以字母順序返回結果檐束,LinkedHashMap
則以第一次出現(xiàn)的單詞的先后順序返回。這也印證了它們各自的特性束倍。
多值Map(Multimaps)
這里指的是一個Map厢塘,可以映射每個key到多個values。Java集合框架并沒有包含一個接口用于多值Map肌幽,主要是因為這個并不是那么常用晚碾。通常利用將一個key映射到一個List來達到多值映射的目的。
比如:
Map<String, List<String>> = new HashMap<String, List<String>>;