HashMap&HashTable&LinkedHashMap&TreeMap
阿新 • • 發佈:2018-11-08
最近發現對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()); } }
更多參考連結: