Java中的Map接口
Map接口的定義:public interface Map<K,V>
很明顯這是個泛型接口,而且接受的是兩個參數:K、V。K代表的是Key,V代表Value。Map存放的是一系列的鍵值對,每個鍵都映射到一個值上。
Map接口要注意的幾點:
- 一個鍵只能映射到一個值
- 不能包含重復的鍵
- Map的結構是無序的,不能夠通過下標來訪問
Map 接口提供三種collection 視圖,允許以鍵集(keySet)、值集(values)或鍵-值映射關系集(entrySet)的形式查看某個映射的內容。
keySet視圖:Set<K> keySet()
該方法返回一個Set集合,類型為Map鍵的類型K。該 set 受映射支持,也就是說,當我們更改set鍵集時,原hashMap也會受到相同的更改,這是非常可怕的一點。
當我們要對hashMap進行遍歷時,可通過該方法來獲取hashMap的鍵集合,從而通過迭代器來對鍵進行遍歷以獲取Map中存放的值。
//獲取鍵集並遍歷獲取值 Set keySets = hashMap.keySet(); for (Object key : keySets) { hashMap.get(key); }
values視圖:Collection<V> values()
返回此映射中包含的值的 Collection 視圖。該 collection 受映射支持,跟上面的Set相同,在我們改變某個值的時候,hashMap也會受到影響。在僅需要知道值而忽略鍵的遍歷時可以用到該方法。遍歷方式同樣是使用迭代器(加強for循環)。
entrySet視圖:Set<Map.Entry<K,V>> entrySet()
這是Map中最重要的一個視圖,它返回的是鍵值對的set集合,就是說set中的每一個元素都是一個Map中的鍵值對。該 set 受映射支持。
entrySet返回一個Set<Map.Entry<K,V>>集合,集合中元素類型為Map.Entry類型,這是Map接口中的一個內部接口,在Map的實現類如HashMap等有其實現類,代表着Map中的一個個節點。
entrySet中的方法:
Map其他的一些常用方法:
containsKey(Object key) 判斷Map中是否包含該鍵containsValue(Object value) 判斷Map中是否存在該valueget(Object key) 通過鍵來獲取其在Map中映射的值put(K key, V value) 添加鍵值對,如果該鍵已存在的話,將把原有值覆蓋putAll(Map<? extends K,? extends V> m) 添加Map對象中的所有鍵值對remove(Object key) 通過鍵移除映射關系size() 獲取Map中存在的鍵值對數量
Map的常用實現類
HashMap:結構是哈希表,其存放的數據是無序的,通過哈希值和equals來對元素進行比較。
TreeMap: 底層結構為二叉樹,存放時將元素進行排序。對於沒有實現比較算法的對象,需要在構造TreeMap時傳入一個該對象的Comparator比較器或讓該對象實現Comparable接口。具體實現與TreeSet相同。
思考:如何將一串字符串中的每個字母出現次數存入字典,並找出第一個出現兩次的字母
我這里采用hashMap來實現,首先我們要將字母次數加入Map中,字母作為鍵,出現次數作為值:
HashMap<Character, Integer> hmc = new HashMap(); for (char c : str.toCharArray()) { //如果該字母已存在於Map中,則將其次數(值)加一,否則添加該鍵,值為1 if (hmc.containsKey(c)) { int count = hmc.get(c); hmc.put(c, ++count); } else { hmc.put(c, 1); } }
其次我們需要找到值為2的鍵值對,獲取該鍵值對的鍵(字母)在字符串中第一次出現的位置(indexOf),並通過一個中間變量來存儲。接着我們以打擂台的形式取得第一次出現位置最小的鍵,就是我們要找的那個字母啦:
Set set = hmc.entrySet(); //獲取鍵值對集 int index = -1; //要找的字母的位置 for (Object object : set) { Entry node = (Entry)object; //鍵值對集中的元素,即Entry節點 char key = (char) node.getKey(); //獲取鍵(字母) if((int)node.getValue()==2) { int num = str.indexOf(key); //該鍵(字母)在字符串中第一次出現的位置 if(index==-1 || str.indexOf(key)<index){ //打擂台,誰小取誰 index = str.indexOf(key); } } }
