1. 程式人生 > >HashMap&HashTable&LinkedHashMap&TreeMap

HashMap&HashTable&LinkedHashMap&TreeMap

最近發現對Map類的理解還不夠深刻 ,因此在這邊趕緊總結mark一下,Map類還是非常有用滴~

  • (1)HashMap與HashTable:

   相同點:這兩者都儲存的鍵值對是無序的

   不同點:HashMap執行緒不安全;HashTable執行緒不安全;

                 HashMap支援key或value的值為Null;Hashtable不支援key或value的值為Null,非法

 一般現在不建議用HashTable,因為:
①HashTable是HashTable是遺留類,內部實現很多沒優化和冗餘。
②即使在多執行緒環境下,現在也有同步的ConcurrentHashMap替代,沒有必要因為是多執行緒而用HashTable。

  • (2)LinkedHashMap&TreeMap

linkedHashMap可以實現按照插入順序或訪問順序進行排序,是HashMap的子類,內部多了雙向連結串列來儲存順序

treeMap按照自然順序或者比較器自定義實現來排序,採用紅黑樹實現,紅黑樹的中序遍歷是有序的

  • package DEMO;
    
    import java.util.*;
    
    //linkedHashMap可以實現按照插入順序和訪問順序進行排序,是HashMap的子類,內部多了雙向連結串列來儲存順序
    //treeMap按照自然順序或者比較器自定義實現來排序
    public class HashMapDemo {
        public static void main(String[] args) {
            //HashMap支援key或value的值為Null
            //注意:HashMap只允許一個key為null
            HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
            hashMap.put(null, null);
            hashMap.put(null, 2);
            System.out.println(hashMap.get(null));
            //Hashtable不支援key或value的值為Null,非法
            /*
            Hashtable<String,Integer> hashtable = new Hashtable<>();
            hashtable.put(null,2);
            System.out.println(hashtable.containsKey(null));
            */
            //LinkedMap
            Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
            linkedHashMap.put("b", 7);
            linkedHashMap.put("c", 2);
            linkedHashMap.put("a", 3);
            linkedHashMap.put("e", 6);
            Iterator it = linkedHashMap.entrySet().iterator();
            System.out.println("=============linkedHashMap:插入順序==============");
            while (it.hasNext())
                System.out.println(it.next());//我們可以看到,其輸出順序是完成按照插入順序的
           //按照訪問順序訪問,最先返回最久沒有訪問過的。如果使用了put/get操作,將對應的鍵值對放到末尾(末尾儲存最近被訪問過的)
            Map<String, String> linkedmap2 = new LinkedHashMap<String, String>(16, 0.75f, true);
            linkedmap2.put("apple", "蘋果");
            linkedmap2.put("watermelon", "西瓜");
            linkedmap2.put("banana", "香蕉");
            linkedmap2.put("peach", "桃子");
            linkedmap2.get("apple");
            Iterator iter = linkedmap2.entrySet().iterator();
            System.out.println("=============LinkedHashMap:訪問順序==============");
            while (iter.hasNext()) {
                System.out.println(iter.next());
            }
            //TreeMap,預設按照自然順序排序
            Map<String, Integer> treeMap = new TreeMap<>();
            treeMap.put("3", 7);
            treeMap.put("4", 2);
            treeMap.put("1", 3);
            treeMap.put("5", 6);
            it = treeMap.entrySet().iterator();
            System.out.println("=============treeMap:升序==============");
            while (it.hasNext())
                System.out.println(it.next());
    
        }
    }
    

    更多參考連結: 

  • http://yikun.github.io/2015/04/06/Java-TreeMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/