2014-10-29 52 views
2

在鏈接的hashmap和hashmap中進行選擇的實際場景是什麼?我已經完成了每項工作,並得出結論,即鏈接映射保持插入的順序,即元素將以與插入順序相同的順序檢索,而散列映射不會維護順序。 那麼有人可以告訴在實際場景中選擇其中一個集合框架,爲什麼?什麼時候在java中通過hashmap使用linkedhashmap?

+0

的([HashMap的,LinkedHashMap的和TreeMap之間的不同]可能的複製http://stackoverflow.com/questions/2889777/difference -Hashmap-linkedhashmap-and-treemap) – Jimmar 2016-10-26 01:14:41

+0

LinkedHashMap的常見用法是LRUCache:http://stackoverflow.com/questions/23772102/lru-cache-in-java-with-generics-and-o1-operations – 2017-02-28 21:03:27

回答

2

LinkedHashMap維護密鑰的插入順序,即密鑰被插入LinkedHashMap的順序。另一方面,HashMap不保留任何順序或鍵或值。在性能方面,HashMapLinkedHashMap之間沒有太大的區別,但是LinkedHashMap有更多的內存足跡比HashMap保持雙向鏈接列表,它用來跟蹤鍵的插入順序。

A HashMapLinkedHashMap具有更好的性能,因爲LinkedHashMap需要花費維護鏈接列表。 LinkedHashMap實現了一個正常的哈希表,但是哈希表的鍵的好處是作爲一個雙向鏈表來存儲。 他們的兩種方法都不同步。 讓我們來看看他們的API文檔:

HashMap是一個哈希表,每個哈希槽中都有一個存儲桶。

API文檔:

此實現提供穩定的性能爲基本 操作(get和put),假定哈希函數將分散的桶中正確的 元素。對集合視圖 的迭代需要的時間與HashMap實例 (桶的數量)加上其大小(鍵值 映射的數量)的「容量」成正比。因此,重要的是,如果迭代性能爲 ,則不要將初始容量設置得太高(或者負載因子太低)。

LinkedHashMap是一個實現地圖接口的鏈表。

哈希表和Map接口的鏈接列表實現,具有 預知的迭代順序:作爲 API文檔中說。該實施方式與HashMap 的不同之處在於其保持通過其所有 條目運行的雙向鏈表。此鏈接列表定義了迭代排序,通常是鍵被插入到地圖 (插入順序)中的順序。

+0

什麼可能是每個的實際情況?爲什麼我們會選擇它? – nikhil 2014-10-29 05:13:12

+0

請通過突出顯示的部分。我希望你能得到答案 – 2014-10-29 05:16:29

2
  • 的HashMap使有關迭代順序絕對沒有保證。它可以(並且將)甚至在添加新元素時完全改變。
  • 的LinkedHashMap將迭代在沃德中的R其中的條目被放進地圖
  • LinkedHashMap中也需要比HashMap的,因爲這種排序功能的更多的內存。正如我之前所說LinkedHashMap使用雙重LinkedList來保持元素的順序。
1

在大多數情況下,當使用Map時,您並不在乎是否保留插入順序。如果您不在意,請使用HashMap,並且您關心LinkedHashMap。但是,如果您查看使用地圖的時間和地點,在很多情況下,它只包含少量條目,不足以滿足不同實現的差異。

4

購物車是一個現實生活中的例子,我們看到購物車號碼與我們選擇的物品相對應,以便我們選擇該物品。因此,地圖可能是LinkedHashMap<Cart Number Vs Item Chosen>

4
  1. 的LinkedHashMap將在該項目中投入了地圖的順序進行迭代。

  2. 在LinkedHashMap中允許空值。

  3. 該實現不同步並使用雙鏈接桶。

  4. LinkedHashMap與HashMap非常相似,但增加了對項目添加或訪問項目的順序的瞭解,因此迭代順序與插入順序相同,具體取決於構造參數。

  5. LinkedHashMap通過重寫removeEldestEntry()方法爲創建Cache對象提供了一個很好的起點。這使您可以使用您定義的某些條件創建可使數據過期的Cache對象。

  6. 基於帶鏈接列表的鏈接列表和哈希數據結構(思考索引SkipList)以數據插入樹中的方式存儲數據。最適合實施LRU(最近最少使用)。 LinkedHashMap擴展了HashMap。

它按照插入順序維護地圖中條目的鏈接列表。這允許在地圖上進行插入順序迭代。也就是說,當迭代LinkedHashMap的collection-view時,元素將按照它們插入的順序返回。此外,如果再次將密鑰插入到LinkedHashMap中,原始訂單將被保留。這允許在地圖上進行插入順序迭代。也就是說,迭代LinkedHashMap時,元素將按照插入的順序返回。你也可以創建一個LinkedHashMap,它按照上次訪問的順序返回它的元素。 - 下面是它的構造:

LinkedHashMap() 

此構造具有默認初始容量(16)和負載因子(0.75)的空插入順序LinkedHashMap實例。

LinkedHashMap(int capacity) 

此構造函數構造一個具有指定初始容量的空LinkedHashMap。

LinkedHashMap(int capacity, float fillRatio) 

該構造函數用指定的初始容量和加載因子構造一個空的LinkedHashMap。

LinkedHashMap(Map m) 

此構造函數使用與指定的Map相同的映射構造插入順序Linked HashMap。

LinkedHashMap(int capacity, float fillRatio, boolean Order) 

該構造函數用指定的初始容量,加載因子和排序模式構造一個空的LinkedHashMap實例。通過LinkedHashMap的

Class clear() 

支持

重要的方法從地圖中刪除所有映射關係。

containsValue(object value)> 

如果此映射將一個或多個鍵映射到指定值,則返回true。

get(Object key) 

返回指定鍵映射到的值;如果此映射不包含鍵映射,則返回null。

removeEldestEntry(Map.Entry eldest) 

下面是你如何使用LinkedHashMap的一個例子:

Map<Integer, String> myLinkedHashMapObject = new LinkedHashMap<Integer, String>(); 
myLinkedHashMapObject.put(3, "car"); 
myLinkedHashMapObject.put(5, "bus"); 
myLinkedHashMapObject.put(7, "nano"); 
myLinkedHashMapObject.put(9, "innova"); 
System.out.println("Modification Before" + myLinkedHashMapObject); 
System.out.println("Vehicle exists: " +myLinkedHashMapObject.containsKey(3)); 
System.out.println("vehicle innova Exists: "+myLinkedHashMapObject.containsValue("innova")); 
System.out.println("Total number of vehicles: "+ myLinkedHashMapObject.size()); 
System.out.println("Removing vehicle 9: " + myLinkedHashMapObject.remove(9)); 
System.out.println("Removing vehicle 25 (does not exist): " + myLinkedHashMapObject.remove(25)); 
System.out.println("LinkedHashMap After modification" + myLinkedHashMapObject); 
相關問題