?Map(和Collection<E>一樣都是集合框架的頂層接口)
|--Hashtable:底層是哈希表數據結構,不可以用null對象作為鍵或值。它是線程同步的。
|--HashMap:底層是哈希表。允許使用null鍵null值,該集合是不同步的,效率高,將Hashtable替代。
|--TreeMap:底層是二叉樹數據結構。線程不同步,可以用于給Map集合中的鍵進行排序。
Map和Set很像,其實,Set底層使用了Map集合。
Map<K, V>:K-此映射所維護的鍵的類型,V-映射值的類型。
Map集合的特點:該集合存儲鍵值對。一對一對往集合里面存,而且要保證鍵的唯一性。
以下是Map集合中的共性方法:
1.添加:V put(K key, V value)用相同的鍵添加值,會覆蓋原來的值,每次添加返回原來鍵所對應的值; void putAll(Map<? extends K, ? extends V> m);
2.刪除:void clear(); V remove(Object key);
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方法,獲取每一個鍵對應的值。
?
Java代碼
interface Map<K, V> {public static interface Entry<K ,V> {}}?class HashMap implements Map<K, V> {class HashEntry implements Map.Entry<K, V> {?}}
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()方法 。
?
Java代碼
?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;}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---------------------");Set<Character> ketSet = treeMap.keySet();?for (Character character : ketSet) {Integer integer = treeMap.get(character);System.out.print(character + "(" + integer + ")");}}}
/* 練習:獲取某個字符串中的字母出現的次數 什么時候使用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 導入的是某一類中的所有靜態成員。
?
轉載于:https://blog.51cto.com/ajiao13/1140887
總結
以上是生活随笔為你收集整理的Java集合框架(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。