2013-06-27 28 views
1

當我運行下面顯示的代碼時,輸​​出是[50,20,5,40,10,30]。 我不明白這個命令。爲什麼輸出不是[10,5,20,30,40,50]?java.util.HashSet int迭代次序

List list = Arrays.asList(10, 5, 10, 20, 30, 40, 50); 
System.out.println(new HashSet(list)); 
+0

'HashSet'不保留插入順序! – NINCOMPOOP

+0

由於HashSets的迭代順序未定義。見Javadoc,你應該在發佈之前諮詢你。 -1 – EJP

+0

EJP你在Baadshah的回答下閱讀我的評論。名譽不是一個目標,我的目標是分享。閱讀raptortech97的回答。 – karlkeller

回答

5

Docs says

此類實現Set接口,由哈希表(實際上是一個HashMap實例)支持。它對集合的迭代次序沒有任何保證;特別是,它不能保證訂單會隨着時間的推移保持不變。這個類允許null元素。

LinkedHashSet

+0

我不想排序。我閱讀文檔,但是當我嘗試另外兩臺電腦時,我得到了相同的輸出。如果訂單不能保證,它是如何相同的? – karlkeller

+1

隨着時間的推移添加和刪除元素,迭代順序可能會發生變化。你不應該依賴Hashset的迭代順序,因爲它「不能保證迭代順序」,儘管在實踐中如果你使用默認的構造函數創建一個新的Hashset並且你添加了相同的元素,那麼你最終會得到相同的迭代訂購。 – raptortech97

+0

raptortech你給了我想知道並想聽到的答案。謝謝。 – karlkeller

0

doc

java.util.HashSet中不保證,以該集合的迭代順序;特別是,它不能保證訂單會隨着時間的推移保持不變。

+2

因爲OP需要插入順序,TreeSet將無法提供幫助。 –

+0

oopse ..謝謝你的糾正.. @ RaviThapliyal – stinepike

+0

LinkedHashSet可以用.. – stinepike

5

HashSet不維護插入順序。你需要的是一個LinkedHashSet

1

HashSet類不能保證您輸入數據的順序。

如果把你的ListHashSet,而是與List繼續你會得到你在它添加值的順序。

您可以使用LinkedHashSet來保留廣告訂單。

如果你想排序List那麼你可以使用Collections.sort()。 (額外的信息,如果你不需要它,請忽略)