因爲在任何線程中都沒有內部和合理的解釋。 請給我確切的理由。爲什麼linkedhashmap維護迭代的雙向鏈表
對於插入順序它足以維持單鏈表,但爲什麼不呢?
在這種情況下,雙向鏈表如何提高性能?
所有的方法都是從hashmap xpt 4方法繼承的,那麼hashmap的迭代器不維護順序,而linkedhashmap維護順序?
因爲在任何線程中都沒有內部和合理的解釋。 請給我確切的理由。爲什麼linkedhashmap維護迭代的雙向鏈表
對於插入順序它足以維持單鏈表,但爲什麼不呢?
在這種情況下,雙向鏈表如何提高性能?
所有的方法都是從hashmap xpt 4方法繼承的,那麼hashmap的迭代器不維護順序,而linkedhashmap維護順序?
爲了保持插入順序有雙鏈表。在任何時間點,您都可以前進節點或後退節點。但是如果你有一個LinkedList,如果你的指針移動到最後一個元素,你需要再次從初始點開始,並且不能移動到前一個節點上。
我不認爲雙向鏈表幫助排序,它只是使遍歷列表更容易 –
如果您看到內部HashMap是基於linkedList。所以如果你有一些信息,比如之前或之後插入了哪個節點,那簡直是一種排序。 – Prashant
單獨鏈接列表足以維護訂單。這不是他們爲什麼在這種情況下使用雙向鏈表的正確解釋。 –
的LinkedHashMap的基本維護兩個指針即每個條目 - : 之前,
後的名稱表明這兩個指針被用於排序目的,並且用於插入的情況下,調整指針或刪除。
你是對的,你只需要維護一個單獨的鏈接列表來跟蹤廣告訂單。但爲了有效地維護一個單一的鏈表,你實際上需要一個雙向鏈表。
考慮三個條目,以便
A ---> B ---> C
假設你刪除B
。顯然A
現在應該指向C
。但是,除非您知道B
之前的條目,否則無法有效地說明哪個條目現在應該指向C
。要解決這個問題,你需要輸入指向兩個方向。
---> --->
A B C
<--- <---
這樣,當你刪除B
你可以看看之前的條目後B
(A
和C
)和更新,以便A
和C
指向對方。
LinkedHashMap
原因LinkedHashMap
維持插入順序,而HashMap
沒有,儘管除了4個方法都被繼承外,其實它是非常巧妙的寫法。大多數實施特定的操作都是HashMap.Entry
的成員,而不是HashMap
。 LinkedHashMap
有一個private static
類別LinkedHashMap.Entry
它擴展了static
類別HashMap.Entry
的HashMap
。例如,當您撥打put
或remove
時,LinkedHashMap
的代碼可以與HashMap
的代碼相同,因爲它是條目本身,用於跟蹤信息前後的信息。作爲一個例子,在這裏是在充分的代碼LinkedHashMap.Entry.remove()
我被解釋上述
private void remove() {
before.after = after;
after.before = before;
}
LinkedHashMap的可用於維持插入順序和用於維持訪問順序。 LinkedHashMap繼承了hashmap的相同功能,用於維護桶中的列表,所以用下一個參考。
爲了維持他們採用雙向鏈表的插入順序(使用和之前之後引用),但是可以通過使用單鏈表來完成。同時他們必須實現訪問順序功能,並且他們需要經常移動元素到最後,並且需要頻繁刪除頻繁刪除他們使用雙向鏈表。
我不認爲雙向鏈表幫助排序,它只是使遍歷列表更容易 –
它不會使遍歷更容易。它只是使得地圖條目的移除更有效率。 –