1. 程式人生 > >java Map之 遍歷Map的四種方法及Map.Entry詳解。轉載至https://blog.csdn.net/Darry_R/article/details/78915420

java Map之 遍歷Map的四種方法及Map.Entry詳解。轉載至https://blog.csdn.net/Darry_R/article/details/78915420

Map是java中的介面,Map.Entry是Map的一個內部介面。

         Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一個Set集合,此集合的型別為Map.Entry。

         Map.Entry是Map宣告的一個內部介面,此介面為泛型,定義為Entry<K,V>。它表示Map中的一個實體(一個key-value對)。介面中有getKey(),getValue方法

下面是遍歷Map的四種方法:

  1. public static void main(String[] args) {  
  2.   
  3.   
  4.   Map<String, String> map = new HashMap<String, String>();  
  5.   map.put("1""value1"
    );  
  6.   map.put("2""value2");  
  7.   map.put("3""value3");  
  8.     
  9.   //第一種:普遍使用,二次取值  
  10.   System.out.println("通過Map.keySet遍歷key和value:");  
  11.   for (String key : map.keySet()) {  
  12.    System.out.println("key= "+ key + " and value= " + map.get(key));  
  13.   }  
  14.     
  15.   //第二種  
  16.   System.out.println("通過Map.entrySet使用iterator遍歷key和value:");  
  17.   Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();  
  18.   while (it.hasNext()) {  
  19.    Map.Entry<String, String> entry = it.next();  
  20.    System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());  
  21.   }  
  22.     
  23.   //第三種:推薦,尤其是容量大時  
  24.   System.out.println("通過Map.entrySet遍歷key和value");  
  25.   for (Map.Entry<String, String> entry : map.entrySet()) {  
  26.    System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());  
  27.   }  
  28.   
  29.   //第四種  
  30.   System.out.println("通過Map.values()遍歷所有的value,但不能遍歷key");  
  31.   for (String v : map.values()) {  
  32.    System.out.println("value= " + v);  
  33.   }  
  34.  }  
下面是HashMap的原始碼:

首先HashMap的底層實現用的時候一個Entry陣列

[java]  view plain  copy
  1. java] view plain copy  
  2. <pre name="code" class="java">  /**  
  3.      * The table, resized as necessary. Length MUST Always be a power of two.  
  4.      */    
  5.     transient Entry[] table; //聲明瞭一個數組    
  6.    ........    
  7.    public HashMap() {    
  8.         this.loadFactor = DEFAULT_LOAD_FACTOR;    
  9.         threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);    
  10.         table = new Entry[DEFAULT_INITIAL_CAPACITY];//初始化陣列的大小為DEFAULT_INITIAL_CAPACITY(這裡是16)    
  11.         init();    
  12.     }</pre><br>    

再來看一下Entry是在什麼地方定義的,繼續上原始碼,我們在HashMap的原始碼中發現了它的定義,原來他是HashMap的一個內部類,並且實現了Map.Entry介面,

[java]  view plain  copy
  1. static class Entry<K,V> implements Map.Entry<K,V> {    
  2.     final K key;    
  3.     V value;    
  4.     Entry<K,V> next;    
  5.     final int hash;    
  6.     
  7.     /**  
  8.      * Creates new entry.  
  9.      */    
  10.     Entry(int h, K k, V v, Entry<K,V> n) {    
  11.         value = v;    
  12.         next = n;    
  13.         key = k;    
  14.         hash = h;    
  15.     }    
  16.     
  17.     public final K getKey() {    
  18.         return key;    
  19.     }    
  20.     
  21.     public final V getValue() {    
  22.         return value;    
  23.     }    
  24.     
  25.     public final V setValue(V newValue) {    
  26.  V oldValue = value;    
  27.         value = newValue;    
  28.         return oldValue;    
  29.     }    
  30.     
  31.     public final boolean equals(Object o) {    
  32.         if (!(o instanceof Map.Entry))    
  33.             return false;    
  34.         Map.Entry e = (Map.Entry)o;    
  35.         Object k1 = getKey();    
  36.         Object k2 = e.getKey();    
  37.         if (k1 == k2 || (k1 != null && k1.equals(k2))) {    
  38.             Object v1 = getValue();    
  39.             Object v2 = e.getValue();    
  40.             if (v1 == v2 || (v1 != null && v1.equals(v2)))    
  41.                 return true;    
  42.         }    
  43.         return false;    
  44.     }    
  45.     
  46.     public final int hashCode() {    
  47.         return (key==null   ? 0 : key.hashCode()) ^    
  48.                (value==null ? 0 : value.hashCode());    
  49.     }    
  50.     
  51.     public final String toString() {    
  52.         return getKey() + "=" + getValue();    
  53.     }    
  54.     
  55.     /**  
  56.      * This method is invoked whenever the value in an entry is  
  57.      * overwritten by an invocation of put(k,v) for a key k that's already  
  58.      * in the HashMap.  
  59.      */    
  60.     void recordAccess(HashMap<K,V> m) {    
  61.     }    
  62.     
  63.     /**  
  64.      * This method is invoked whenever the entry is  
  65.      * removed from the table.  
  66.      */    
  67.     void recordRemoval(HashMap<K,V> m) {    
  68.     }    

Map介面不是Collection介面的繼承。Map介面用於維護鍵/值對(key/value pairs)。該介面描述了從不重複的鍵到值的對映。

 Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一個Set集合,此集合的型別為Map.Entry。

下面看如下的遍歷程式碼

[java]  view plain  copy
  1. [java] view plain copy  
  2. 1.  Map map = new HashMap();    
  3.     
  4.          Irerator iterator = map.entrySet().iterator();    
  5.     
  6.          while(iterator.hasNext()) {    
  7.     
  8.                  Map.Entry entry = iterator.next();    
  9.     
  10.                  Object key = entry.getKey();    
  11.     
  12.                  //    
  13.     
  14.          }    
  15.     
  16.      2.Map map = new HashMap();     
  17.     
  18.          Set  keySet= map.keySet();    
  19.     
  20.          Irerator iterator = keySet.iterator;    
  21.     
  22.          while(iterator.hasNext()) {    
  23.     
  24.                  Object key = iterator.next();    
  25.     
  26.                  Object value = map.get(key);    
  27.     
  28.                  //    
  29.     
  30.          }    
  31. 另外,還有一種遍歷方法是,單純的遍歷value值,Map有一個values方法,返回的是value的Collection集合。通過遍歷collection也可以遍歷value,如  
  32. [java] view plain copy  
  33. Map map = new HashMap();    
  34.     
  35. Collection c = map.values();    
  36.     
  37. Iterator iterator = c.iterator();    
  38.     
  39. while(iterator.hasNext()) {    
  40.     
  41.        Object value = iterator.next();     
好了,關於Map集合的介紹就到這裡了,到這裡應該就差不多明瞭Map的原理和方法作用了.

還是要宣告下:本文僅供參考,歡迎轉載分享交流.(其中部分內容摘自其他博主.)

                                                                                                                                                                                         

            

                                                                                                                                                                                                                          生活不只有Coding!