首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Merlin 集合增強:LinkedHashSet 與 LinkedHashMap 維護插入/存取順序

     編輯:Java 相關知識

動機:有序散列集合

J2SE 1.4 引入 LinkedHashSet 和 LinkedHashMap,在散列基礎上維護雙向鏈表,迭代器按插入順序返回元素(而非散列順序)。LinkedHashMap 額外支援存取順序模式(LRU 適合快取)。

LinkedHashSet 用法

繼承 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...

LinkedHashMap 用法

繼承 HashMap,五構造函數,新增 accessOrder 參數(預設 false 為插入順序,true 為存取順序)。迭代次數不受容量影響(優於 HashMap)。填入英/義月份對照:

Map orderedMap = new LinkedHashMap();
Map unorderedMap = new HashMap();
for (int i=0; i

值集合迭代亦按插入順序:orderedMap.values() 依序輸出 gennaio, febbraio...。

存取順序模式 (LRU)

構造函數傳 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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved