Java集合框架(3)

 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方法,獲取每個鍵對應的值。

 

Java代碼 複製代碼 收藏代碼
  1. interface Map<K, V> {
  2. public static interface Entry<K ,V> {
  3. // 只有接口處於處於成員變量的位置,才能夠用static修飾
  4. }
  5. }
  6.  
  7. class HashMap implements Map<K, V> {
  8. class HashEntry implements Map.Entry<K, V> {
  9.  
  10. }
  11. }

若是某個類須要建立多個對象,最好實現Comparable<E>接口(具有天然順序),覆寫hashCode()和equals()方法 。

 

Java代碼 複製代碼 收藏代碼
  1. /* 練習:獲取某個字符串中的字母出現的次數
  2. 何時使用Map集合?當數據之間存在着映
  3. 射關係時,就要先想到Map集合 */
  4.  
  5. import java.util.Map;
  6. import java.util.Set;
  7. import java.util.TreeMap;
  8.  
  9. public class TreeMapDemo {
  10.  
  11.  
  12. public static void main(String[] args) {
  13. charCount("dgadfhfsdghrsahfswrteurirwxvnxmxmxmbxhahaf");
  14. }
  15.  
  16. public static void charCount(String str) {
  17. char[] chs = str.toCharArray();
  18.  
  19. TreeMap<Character, Integer> treeMap = new TreeMap<Character, Integer>();
  20. Integer temp;
  21. int count = 0;
  22. for (int i=0; i<chs.length; i++) {
  23.  
  24. if((temp = treeMap.get(chs[i])) != null) {
  25. count = temp;
  26. }
  27. count++;
  28. treeMap.put(chs[i], count);
  29. count = 0;
  30. }
  31. //(1)從Map集合中的第一種取出方式:entrySet()
  32. System.out.println("--------------first---------------------");
  33. Set<Map.Entry<Character, Integer>> treemapEntry = treeMap.entrySet();
  34.  
  35. for (Map.Entry<Character, Integer> me : treemapEntry){
  36. Character character = me.getKey();
  37. Integer integer = me.getValue();
  38. System.out.print(character + "(" + integer + ")");
  39. }
  40. System.out.println("\n" + "--------------second---------------------");
  41. //(1)從Map集合中的第一種取出方式: keySet()
  42. Set<Character> ketSet = treeMap.keySet();
  43.  
  44. for (Character character : ketSet) {
  45. Integer integer = treeMap.get(character);
  46. System.out.print(character + "(" + integer + ")");
  47. }
  48. }
  49. }

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 導入的是某一類中的全部靜態成員。

相關文章
相關標籤/搜索