Java基礎及提高教程目錄
Map 接口的哈希表和鏈接列表實現,具有可預知的迭代順序。此實現與 HashMap 的不同之處在於,後者維護著一個運行於所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,該迭代順序通常就是將鍵插入到映射中的順序(插入順序)。注意,如果在映射中重新插入 鍵,則插入順序不受影響。(如果在調用 m.put(k, v) 前 m.containsKey(k) 返回了 true,則調用時會將鍵 k 重新插入到映射 m 中。)
此實現可以讓客戶避免未指定的、由 HashMap(及 Hashtable)所提供的通常為雜亂無章的排序工作,同時無需增加與 TreeMap 相關的成本。使用它可以生成一個與原來順序相同的映射副本,而與原映射的實現無關:
1.package collection;
2.
3.import java.util.HashMap;
4.import java.util.Iterator;
5.import java.util.LinkedHashMap;
6.import java.util.Map;
7.
8./**
9. * 老紫竹JAVA提高教程(14)-認識Map之LinkedHashMap。
10. *
11. * 這個類繼承自HashMap,擁有其全部特性.
12. * 同時內部維護著一個所有條目的雙重鏈接,具有可預知的迭代順序。
13. * 默認按照插入的順序進行顯示.
14. * 重復插入一個Key的數據,不會影響到使用的先後順序。
15. * 此類避免了HashMap的雜亂無章的使用順序,同時又避免了TreeMap的額外成本.
16. *
17. * @author 老紫竹 JAVA世紀網(java2000.net)
18. *
19. */
20.public class Lession14LinkedHashMap {
21. public static void main(String[] args) {
22. // 分別使用2個類,進行相同的數據測試
23. // 可以看到,HashMap的順序是不可預測的
24. // 而LinkedHashMap的順序嚴格按照插入順序
25.
26. // 102=>102; 100=>100; 101=>101; 98=>98; 99=>99;
27. testMap(new HashMap());
28. // 98=>98; 99=>99; 100=>100; 101=>101; 102=>102;
29. testMap(new LinkedHashMap());
30.
31. // 刪除數據後,LinkedHashMap會將數據放到末尾最後的位置
32. // 而HashMap可能會使用前一個空缺的位置
33. }
34.
35. public static void testMap(Map map) {
36. for (int i = 98; i <= 102; i++) {
37. map.put(i, i);
38. }
39. showMap(map);
40. // 嘗試重復插入數據
41. map.put(100, 100);
42. showMap(map);
43.
44. // 刪除數據,並再次插入
45. map.remove(100);
46. map.put(100, 100);
47. showMap(map);
48. }
49.
50. public static void showMap(Map map) {
51. // 迭代Key的操作
52. Iterator it = map.keySet().iterator();
53. Object key;
54. while (it.hasNext()) {
55. key = it.next();
56. System.out.print(key + "=>" + map.get(key) + "; ");
57. }
58. System.out.println();
59. }
60.}
運行效果:
102=>102; 100=>100; 101=>101; 98=>98; 99=>99; 102=>102; 100=>100; 101=>101; 98=>98; 99=>99; 102=>102; 100=>100; 101=>101; 98=>98; 99=>99; 98=>98; 99=>99; 100=>100; 101=>101; 102=>102; 98=>98; 99=>99; 100=>100; 101=>101; 102=>102; 98=>98; 99=>99; 101=>101; 102=>102; 100=>100;