2016-05-14 41 views
5

某些測試用例在我的應用程序中失敗,這取決於元素的插入順序。它使用Java 7中很好地工作,但升級到Java 8之後,這個問題開始在網上搜索,我發現這個在article在Java 8中迭代HashMap時穩定的元素排序問題

的Java 8包括到HashSet的/地圖迭代順序一些可能的變化:

可以請一些人建議我 - 我如何在Map中按照與插入順序相同的順序迭代Map中的對象,考慮到我仍將在我的開發環境中使用Java 1.8?

是當然它從來沒有通過HashMap的放心,對象可以以相同的順序進行檢索,但它是在使用Java 7中

工作是否LinkedHashMap工作來實現這一點?

+1

'LinkedHashMap'文件告訴你什麼? – RealSkeptic

+6

您是否檢查過Java 7的'HashMap'文檔說明?:https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html:**該類不保證地圖的順序;特別是,它不能保證順序會隨着時間的推移保持不變。**您必須使用保證順序的其他集合 - LinkedHashMap – krokodilko

+1

使用TreeMap來代替javaDocs:基於紅黑樹的NavigableMap實現。該地圖根據其按鍵的自然順序或在地圖創建時提供的比較器進行排序,具體取決於使用哪個構造函數。 –

回答

8

是的,你必須使用LinkedHashMap具有穩定的迭代順序乃至全國的Java版本中,被強迫其contract

此實現與HashMap的不同之處在於,後者維護着所有正在運行一個雙向鏈表的條目。這個鏈表定義了迭代排序,這通常是鍵被插入映射的順序(插入順序)。請注意,如果將鍵重新插入到地圖中,則插入順序不受影響。

在很多情況下,我們還需要在不同Java版本之間的可重複迭代順序,LinkedHashMap工作得很好。


TreeMap也是穩定迭代次序的解決方案。當然,它有一個對數運算時間(相對於恆定在LinkedHashMap)和迭代順序沒有插入順序但鍵順序:

該地圖是根據其鍵的自然順序進行排序,或者通過比較器通常在分類圖創建時提供。