LinkedHashMap是Java提供的一種Map集合類型,繼承於HashMap並實現了Map介面和雙向鏈表數據結構。相比HashMap,它可以在保持快速查找的同時,保證迭代順序和插入順序是一致的。這就意味著它是有序的。
一、keyset有序嗎
LinkedHashMap的keyset是有序的,輸出順序和插入順序一致。其實這個也是由雙向鏈表的結構所決定的,因為每一個元素在插入的時候都會被封裝成為Entry類型,並存儲在一個雙向鏈表中,因此在訪問keyset的時候,就會按照鏈表的順序返回。
LinkedHashMap map = new LinkedHashMap(); map.put("apple", 1); map.put("pear", 2); map.put("banana", 3); for (String key : map.keySet()) { System.out.println(key); } // 輸出結果為: // apple // pear // banana
二、LinkedHashMap有序遍歷
如果需要遍歷整個LinkedHashMap,我們可以使用entrySet()方法,該方法會返回一個有序的集合,裡面包含了所有的Entry元素,然後我們可以根據entry的key和value進行相應的操作。
LinkedHashMap map = new LinkedHashMap(); map.put("apple", 1); map.put("pear", 2); map.put("banana", 3); for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() +" - "+ entry.getValue()); } // 輸出結果為: // apple - 1 // pear - 2 // banana - 3
三、ConcurrentHashMap有序嗎
相比之下,ConcurrentHashMap是沒有順序保障的。雖然它內部也有一個對於迭代順序有保障的結構類似於Segment,不過ConcurrentHashMap為了支持高並發,限制了各種鎖的範圍,導致它無法對於整個Map進行順序的保證。
四、LinkedHashMap有序還是無序
LinkedHashMap是有序的,這可以從其構造函數中第三個參數accessOrder為true時得到體現。如果該參數的值為true,則在對Map中的元素進行get()、put()、putAll()操作時,都會將元素移到最後一個位置,因此訪問順序也可以通過這個方式被保證。
LinkedHashMap map = new LinkedHashMap(16, 0.75f, true); map.put("apple", 1); map.put("pear", 2); map.put("banana", 3); map.get("apple"); // 讓apple成為最後訪問的元素 for (String key : map.keySet()) { System.out.println(key); } // 輸出結果為: // pear // banana // apple
五、LinkedHashMap為什麼有序
LinkedHashMap之所以有序,是因為在Map中維護了一個雙向鏈表,他被稱為記錄插入順序或者訪問順序。這個雙向鏈表記錄了每一個元素的插入或訪問順序,所以每次遍歷都是按照這個順序進行的。如果我們需要改變這個順序,可以使用accessOrder參數設置,該參數會讓LinkedHashMap在對元素進行get()、put()、putAll()操作時將元素移到最後一個位置,這樣就保證了遍歷順序。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/291026.html