Map(和Collection<E>同樣都是集合框架的頂層接口)java
|--Hashtable:底層是哈希表數據結構,不能夠用null對象做爲鍵或值。它是線程同步的。數組
|--HashMap:底層是哈希表。容許使用null鍵null值,該集合是不一樣步的,效率高,將Hashtable替代。數據結構
|--TreeMap:底層是二叉樹數據結構。線程不一樣步,能夠用於給Map集合中的鍵進行排序。框架
Map和Set很像,其實,Set底層使用了Map集合。 ide
Map<K, V>:K-此映射所維護的鍵的類型,V-映射值的類型。工具
Map集合的特色:該集合存儲鍵值對。一對一對往集合裏面存,並且要保證鍵的惟一性。url
如下是Map集合中的共性方法:spa
1.添加:V put(K key, V value)用相同的鍵添加值,會覆蓋原來的值,每次添加返回原來鍵所對應的值; void putAll(Map<? extends K, ? extends V> m);線程
2.刪除:void clear(); V remove(Object key);code
3.判斷:boolean containsKey(Object key); boolean containsValue(Object value);boolean isEmpty();
4.獲取:V get(Object key)能夠經過get方法的返回值來判斷一個鍵值對是否存在; int size(); Collection<V> values();
兩個重要的方法(Map集合的兩種取出方式):
Set<Map.Entry<K, V>> entrySet():返回此映射中包含的映射關係的Set視圖。而這個映射關係的數據類型就是Map.Entry。得到關係對象Map.Entry後,就能夠經過Map.Entry中getKey和getValue方法得到鍵和值。
Set<K> keySet():返回此映射中包含的鍵的Set視圖。由於Set具有迭代器,全部能夠用迭代方式取出全部的鍵,再根據get方法,獲取每個鍵對應的值。
interface Map<K, V> { public static interface Entry<K ,V> { // 只有接口處於處於成員變量的位置,才能夠用static修飾 } } class HashMap implements Map<K, V> { class HashEntry implements Map.Entry<K, V> { } }
若是某個類須要建立多個對象,最好實現Comparable<E>接口(具有天然順序),覆寫hashCode()和equals()方法 。
/* 練習:獲取某個字符串中的字母出現的次數 何時使用Map集合?當數據之間存在着映 射關係時,就要先想到Map集合 */ import java.util.Map; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo { public static void main(String[] args) { charCount("dgadfhfsdghrsahfswrteurirwxvnxmxmxmbxhahaf"); } public static void charCount(String str) { char[] chs = str.toCharArray(); TreeMap<Character, Integer> treeMap = new TreeMap<Character, Integer>(); Integer temp; int count = 0; for (int i=0; i<chs.length; i++) { if((temp = treeMap.get(chs[i])) != null) { count = temp; } count++; treeMap.put(chs[i], count); count = 0; } //(1)從Map集合中的第一種取出方式:entrySet() System.out.println("--------------first---------------------"); Set<Map.Entry<Character, Integer>> treemapEntry = treeMap.entrySet(); for (Map.Entry<Character, Integer> me : treemapEntry){ Character character = me.getKey(); Integer integer = me.getValue(); System.out.print(character + "(" + integer + ")"); } System.out.println("\n" + "--------------second---------------------"); //(1)從Map集合中的第一種取出方式: keySet() Set<Character> ketSet = treeMap.keySet(); for (Character character : ketSet) { Integer integer = treeMap.get(character); System.out.print(character + "(" + integer + ")"); } } }
Map擴展知識
Map集合被使用是由於具有映射關係
Map<K, Map<K1, V1>>
Map<K, Collection<T>>
上面是一個一對多映射關係,第二種形式在開發中比較常見。
-----------------------分----------割-------------線---------------
集合框架中的工具類:
(1)Collections:集合工具類
1. public static <T extends Comparable<? super T>> void sort(List<T> list);//默認排序
2. public static <T> void sort(List<T>, Comparator<? super T> c);// 自定義排序,利用比較器
3. public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
4. binarySearch();
5. static <T> void fill(List<? super T> list, T obj); // 用obj替代集合中的元素
6. reverseOrder(),返回一個相反的比較器,直接查文檔,這個類中有不少有用的靜態方法。
7.<T> T[] toArray(T[] a);//集合變數組,
1. 傳入的形參數組到底應該定義多長呢?當傳入的形參數組長度小於集合的size,那麼該方法內部會建立一個新的數組。它的長度剛恰好是集合的size。 當傳入的形參數組長度大於集合的size,那麼就不會建立新的數組。就使用傳進來的數組。
2. 爲何要將集合變成數組?爲了限定對元素的操做。不須要進行增刪了。
(2)Arrays:數組工具類
1. asList():將數組變成List集合,這樣可使用集合的思想和方法來操做數組中的元素。注意:將數組變成集合,不可使用集合的增刪方法,由於數組的長度是固定的。若是數組中的元素都是對象,那麼變成集合時,數組中的元素就直接轉成集合中的元素。若是數組中的元素都是基本類型,那麼會將該數組做爲集合中的元素存在。
2. 其餘方法能夠看文檔
加強for循環(JDK 1.5):爲了簡化書寫,可是會有侷限性,即只能獲取元素,可是不能對集合進行操做。可是迭代器除了遍歷,還能夠進行remove集合中的元素。若是是用ListIterator,還能夠在遍歷過程當中進行增刪改操做。要使用foreach語句,須要實現Iterable<T>接口
可變參數:JDK 1.5 版本出現的新特性,實際上是數組參數的簡寫形式,不用每一次都手動的創建數組對象,只要將要操做的元素做爲參數傳遞便可,隱式將這些參數封裝成了數組。在使用時注意:可變參數必定要定義在參數列表的最後面。
靜態導入:import static 導入的是某一類中的全部靜態成員。