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;