首頁  >  文章  >  Java  >  Java中HashMap遍歷與使用的範例詳解

Java中HashMap遍歷與使用的範例詳解

黄舟
黄舟原創
2017-08-09 09:29:151429瀏覽

map的幾種遍歷方式: 

Map< String, String> map = new HashMap<>();

   map.put("aa", "@sohu.com");

   map.put("bb","@163.com");

   map.put("cc", "@sina.com");

   System.out.println("普通的遍历方法,通过Map.keySet遍历key和value");//普通使用,二次取值

   for (String key : map.keySet()) {

       System.out.println("key= "+key+" and value= "+map.get(key));

   }

   System.out.println("通过Map.entrySet使用iterator遍历key和value:");

   Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();

   while(it.hasNext()){

       Map.Entry<String, String> entry = it.next();

       System.out.println("key= "+entry.getKey()+" and value= "+entry.getValue());

   }

   System.out.println("通过Map.entrySet遍历key和value");    //推荐这种,特别是容量大的时候

   for(Map.Entry<String, String> entry : map.entrySet()){

       System.out.println("key= "+entry.getKey()+" and value= "+entry.getValue());

   }
  System.out.println(“通过Map.values()遍历所有的value,但不能遍历key”);

   for(String v : map.values()){

       System.out.println("value = "+v);

   }

HashMap和Hashtable的連結和差異 
實作原理相同,功能相同,底層都是哈希表結構,查詢速度快,在很多情況下可以互用,早期的版本一般都是安全的。

  • HashMap和Hashtable都實作了Map接口,但決定用哪一個之前先要弄清楚它們之間的分別。主要的差異有:線程安全性,同步(synchronization),以及速度。

  • HashMap幾乎可以等價於Hashtable,除了HashMap是非synchronized的,並且可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。

  • HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable;而如果沒有正確的同步的話,多個線程是不能共享HashMap的。 Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴充性更好。

  • 另一個差異是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當有其它線程改變了HashMap的結構(增加或移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這並不是一定發生的行為,要看JVM。這同樣也是Enumeration和Iterator的差別。

  • 由於Hashtable是執行緒安全的也是synchronized,所以在單執行緒環境下它比HashMap慢。如果你不需要同步,只需要單一線程,那麼使用HashMap效能就好過Hashtable。 
    HashMap無法保證隨著時間的推移Map中的元素順序是不變的。


hashmap的特點 
HashMap是map介面的子類,是將鍵映射到值的對象,其中鍵和值都是對象,不是線程安全的 
hashMap用hash表來儲存map的鍵 
  key是無序唯一,可以有一個為null 
  value無序不唯一,可以有對個null 
linkedHashMap使用hash表儲存map中的鍵,並且使用linked雙向鍊錶管理順序

  • #我們用的最多的是HashMap,在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。如果需要輸出的順序和輸入的相同,那麼用LinkedHashMap 可以實現,它還可以按讀取順序來排列.

  • HashMap是一個最常用的Map,它根據鍵的hashCode值儲存數據,根據鍵可以直接取得它的值,具有快速的存取速度。 HashMap最多只允許一筆記錄的鍵為NULL,允許多筆記錄的值為NULL。 HashMap不支援執行緒同步,也就是任一時刻可以有多個執行緒同時寫入HashMap,可能會導致資料的不一致性。

  • 如果需要同步,可以用Collections的synchronizedMap方法讓HashMap具有同步的能力。 LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的。

HashMap可以透過下面的語句來同步: 

Map m = Collections.synchronizeMap(hashMap);

幾大常用集合的效率比較 
Java中HashMap遍歷與使用的範例詳解

 

以上是Java中HashMap遍歷與使用的範例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn