J2SE 1.4 引入 LinkedHashSet 和 LinkedHashMap,在散列基礎上維護雙向鏈表,迭代器按插入順序返回元素(而非散列順序)。LinkedHashMap 額外支援存取順序模式(LRU 適合快取)。
繼承 HashSet,無新方法,四構造函數。用 Arrays.asList() 將陣列轉列表傳入構造函數保持順序。範例:英文月份名稱填入 LinkedHashSet 與 HashSet 對比。
String[] months = new DateFormatSymbols().getMonths();
List list = Arrays.asList(months);
Set ordered = new LinkedHashSet(list);
Set unordered = new HashSet(list);
System.out.println("Ordered: " + ordered); // January, February...
System.out.println("Unordered: " + unordered); // March, April, November...
繼承 HashMap,五構造函數,新增 accessOrder 參數(預設 false 為插入順序,true 為存取順序)。迭代次數不受容量影響(優於 HashMap)。填入英/義月份對照:
Map orderedMap = new LinkedHashMap();
Map unorderedMap = new HashMap();
for (int i=0; i
值集合迭代亦按插入順序:orderedMap.values() 依序輸出 gennaio, febbraio...。
構造函數傳 true 啟用:新增條目置尾,get() 將條目移至尾部(最近使用)。多線程讀取需同步。範例:存取 June、April、February 後,這三月移至尾部(February 最後)。
Map accessMap = new LinkedHashMap(20, 0.75f, true);
for (int i=0; i
注意:getMonths() 返回 13 個元素(最後一個空字串),故輸出含額外 = 條目。1.4 beta 2 添加 removeEldestEntry() 受保護方法,子類可覆寫實現固定大小快取(如返回 true 移除最老條目)。
整合上述所有演示,含有序/無序 Set/Map、值迭代、存取順序 Map。