2012-06-16 235 views
9

鏈接HashMap LIFO或FIFO的性質? 如果我的地圖的形式是 - >LinkedHashMap LIFO或FIFO?

map.put(1,"one"); 
map.put(2,"two"); 

會是什麼,如果我是遍歷使用鍵集地圖上的順序?

編輯:我想我確實混淆了兩個不同的概念。我重新說明了這個問題。我會遇到使用入門集的數量的順序是什麼?謝謝指出,btw.i無意刪除任何條目。

+0

Upvoted,因爲我認爲downvote是沒有根據的 – Dancrumb

+0

它是'最後進入',但取決於您的使用情況可以從任何地方刪除。 –

回答

11

在鏈接散列映射中,在末尾添加了後備雙鏈表中的元素(顯然:用於保留迭代順序),但可以從元素從映射中移除時從列表中的任何部分移除,將後備列表(以及擴展名:地圖)標記爲LIFO或FIFO是不正確的 - 它們都不是 - 在地圖中沒有刪除順序的概念,因此鏈接的哈希中的後備列表不會有任何刪除順序地圖。

什麼是鏈接哈希映射確實保證是遍歷它的內容(不管它:鍵或條目)將按照相同的順序發生在元素插入映射;從documentation

該實現不同於HashMap,因爲它維護一個雙向鏈接列表運行通過它的所有條目。這個鏈表定義了迭代排序,這通常是鍵被插入映射的順序(插入順序)。

編輯:

關於上次編輯的問題,一個LinkedHashMap保證keySet()的迭代順序將在該元素被插入相同的順序:1, 2爲示例在問題中。這與FIFO/LIFO無關,這些概念處理元素從數據結構中移除的順序,並且在插入元素後它們與迭代順序無關。

+0

downvoter,謹慎解釋? –

+0

(1)LinkedHashMap中的順序被定義爲插入順序,因此(2)排序的概念確實存在,並且(3)關於「移除順序」的問題中沒有任何內容,無論可能如何。現在,您在編輯中添加的第二段與第一段相矛盾。 – EJP

+1

@EJP LIFO表示刪除操作發生時,添加的最後一個元素將是第一個_removed_。 FIFO表示刪除操作發生時,第一個添加的元素將是第一個_removed_。所以你看,LIFO/FIFO與去除有關,一切都與迭代或排序有關,OP會混淆不同的概念,你也是如此。 –

5

LinkedHashMap引用的javadocs是「Map接口的哈希表和鏈表實現,具有可預測的迭代順序」。因此,keySet將基於插入順序返回密鑰,基本上是FIFO。

1

根據Java文檔,如果您要遍歷映射,鍵集將按插入順序排列。所以你得到的第一個鍵是輸入的第一個鍵,而不是現有的鍵。請注意,重新插入鍵值對不會更改原始鍵位置。

1

當沒有使用訪問順序時(標準情況),您可以將LHM視爲一個鏈接列表,通過鍵快速訪問O(1)。

在這方面,當訪問順序未使用時,它是FIFO(查看c-tors)。當使用訪問訂單時,如果有任何get()操作對訂單進行重新排序,則放置訂單無關緊要。看看protected boolean removeEldestEntry(Map.Entry<K,V> eldest)老大= FIFO。

本質上,LHM是一個很好的雙向鏈表,其中Map.Entry<Key, Value>帶有散列索引。 我自己從來沒有在當前的impl中使用vanilla HashMap。它與LHM相比幾乎沒有什麼好處 - 內存佔用少,但可迭代次數很多。 Java8(或9)也許可能會最終修復HashMap,希望Doug Lea能夠推動他的impl。