支持數據結構是一個HashMap,它基本上是一個Entry數組。由於支持結構是一個數組,迭代順序如何隨時間變化?Java *中的HashSet如何在迭代時不保證順序?
回答
散列集的迭代次序是任意的,但它是確定性的。
訂單不隨時間變化,除非集合在迭代之間發生變化。給定相同的項目集合和特定的插入順序,迭代順序將保持不變。
如果插入或刪除項目,迭代順序將發生變化。底層數據結構(一個列表節點數組)保持不變,但由於將項目放置到哈希桶中是由項目的哈希代碼確定的,因此當您迭代哈希時,無法確定特定項目最終會到達哪裏組。
文檔確實say迭代的順序不能保證:
[
HashSet
]不保證,以該集合的迭代順序;特別是,它不能保證訂單會隨着時間的推移保持不變。
的「一段時間」的部分是相當模糊的,原因有二:如果「隨着時間的推移」指的是你的程序的運行時間,或升級到Java類庫之間的時間目前尚不清楚,和在允許改變迭代次序的時間內是否允許修改也是不清楚的。然而,知道散列集的組織和實現方式,迭代次序在缺少更新時仍然保持確定性是非常接近的確定性。但這並不意味着您可以依靠訂單,因爲它隨時都可能發生變化。
我不認爲這是真的。從javadocs:「它不能保證集合的迭代順序;特別是,它不能保證順序會隨着時間的推移保持不變。」從這句話我明白,即使你不添加/刪除任何元素,迭代順序仍然可以改變。 – user2698
@ user2698 - 那麼,對於'HashSet'的不同實現,它們可以改變!關鍵在於javadoc是一個契約,即使它的代碼被完全重寫,HashSet的過去,現在和未來版本也會滿足這個契約。合同規定「不要依賴在某些情況下我們不能告訴你的訂單不變......」。 –
哦,是的...和序列化/反序列化可能會改變迭代順序,就像使用'new HashSet(set)'複製一樣。 –
- 1. scala迭代java hashSet
- 2. 是否保證在PHP中按照數組順序迭代foreach?
- 3. 如何迭代Java中的hashset中的單個值
- 4. Java中輸出順序Hashset的基礎
- 5. 當使用HashMap時,迭代時保證值和鍵的順序是相同的?
- 6. 從HashSet的迭代的
- 7. 迭代隊列<T>保證按隊列順序?
- 8. C#字典<TKey,TValue>是否保證迭代順序?
- 9. 切片迭代順序在
- 10. Java ConcurrentLinkedQueue迭代元素順序?
- 11. HashSet不爲空,但不能迭代?
- 12. 從一個HashSet迭代它
- 13. 是否foreach by-definition保證在Scala中順序迭代主題集合?
- 14. 迭代函數參數並保留python中的排序順序
- 15. 如何按特定順序迭代?
- 16. 如何迭代使用特定順序
- 17. 迭代python列表:迭代順序
- 18. Objective-C中的快速枚舉是否保證了迭代的順序?
- 19. 我如何保持hashset按字母順序排列?
- 20. 迭代HashSet爲每個
- 21. 無法迭代完成HashSet
- 22. 使用JSTL迭代HashSet
- 23. 隨機交織多個迭代,同時保留它們在python中的順序
- 24. 如何在JavaScript中以相反的順序迭代Set或Map?
- 25. Python:迭代元組時,順序是否保留?
- 26. Python中集合的迭代順序
- 27. 迭代非順序列
- 28. 怪字典迭代順序
- 29. 在Java中保證操作的從左到右順序?
- 30. 如何在Grails中以相反順序迭代對象列表?
你的基本假設(它只是一個數組而不是別的)是不正確的。閱讀哈希表數據結構上的Wikipedia文章。 –
HashMap只是一個數組。請參閱http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/HashMap.java#HashMap.0table – user2698
@ user2698 - 是的......但是你看看其餘的代碼?方法...例如?它不僅僅是一個數組**而且沒有別的**。 –