2015-01-13 31 views
11

因爲在任何線程中都沒有內部和合理的解釋。 請給我確切的理由。爲什麼linkedhashmap維護迭代的雙向鏈表

  1. 對於插入順序它足以維持單鏈表,但爲什麼不呢?

  2. 在這種情況下,雙向鏈表如何提高性能?

  3. 所有的方法都是從hashmap xpt 4方法繼承的,那麼hashmap的迭代器不維護順序,而linkedhashmap維護順序?

+0

我不認爲雙向鏈表幫助排序,它只是使遍歷列表更容易 –

+0

它不會使遍歷更容易。它只是使得地圖條目的移除更有效率。 –

回答

1

爲了保持插入順序有雙鏈表。在任何時間點,您都可以前進節點或後退節點。但是如果你有一個LinkedList,如果你的指針移動到最後一個元素,你需要再次從初始點開始,並且不能移動到前一個節點上。

+2

我不認爲雙向鏈表幫助排序,它只是使遍歷列表更容易 –

+0

如果您看到內部HashMap是基於linkedList。所以如果你有一些信息,比如之前或之後插入了哪個節點,那簡直是一種排序。 – Prashant

+0

單獨鏈接列表足以維護訂單。這不是他們爲什麼在這種情況下使用雙向鏈表的正確解釋。 –

3

的LinkedHashMap的基本維護兩個指針即每個條目 - : 之前,

後的名稱表明這兩個指針被用於排序目的,並且用於插入的情況下,調整指針或刪除。

8

你是對的,你只需要維護一個單獨的鏈接列表來跟蹤廣告訂單。但爲了有效地維護一個單一的鏈表,你實際上需要一個雙向鏈表。

考慮三個條目,以便

A ---> B ---> C 

假設你刪除B。顯然A現在應該指向C。但是,除非您知道B之前的條目,否則無法有效地說明哪個條目現在應該指向C。要解決這個問題,你需要輸入指向兩個方向。

---> ---> 
A  B  C 
    <--- <--- 

這樣,當你刪除B你可以看看之前的條目後BAC)和更新,以便AC指向對方。

LinkedHashMap原因LinkedHashMap維持插入順序,而HashMap沒有,儘管除了4個方法都被繼承外,其實它是非常巧妙的寫法。大多數實施特定的操作都是HashMap.Entry的成員,而不是HashMapLinkedHashMap有一個private static類別LinkedHashMap.Entry它擴展了static類別HashMap.EntryHashMap。例如,當您撥打putremove時,LinkedHashMap的代碼可以與HashMap的代碼相同,因爲它是條目本身,用於跟蹤信息前後的信息。作爲一個例子,在這裏是在充分的代碼LinkedHashMap.Entry.remove()我被解釋上述

private void remove() { 
    before.after = after; 
    after.before = before; 
} 
0

LinkedHashMap的可用於維持插入順序和用於維持訪問順序。 LinkedHashMap繼承了hashmap的相同功能,用於維護桶中的列表,所以用下一個參考。

爲了維持他們採用雙向鏈表的插入順序(使用之前之後引用),但是可以通過使用單鏈表來完成。同時他們必須實現訪問順序功能,並且他們需要經常移動元素到最後,並且需要頻繁刪除頻繁刪除他們使用雙向鏈表。