[英]Random order of a HashSet is always same until Server stopped
HashSet
不會保持其元素的順序。我將我的應用程序部署到jBoss
服務器,並且正在觀察HashSet
的順序。 這是隨機的。
但是始終具有相同的隨機順序, 直到我重新啟動應用程序服務器 。 任何人都可以用基本機制解釋這種情況嗎?
我正在研究一個與HashSet<Object>
的元素順序有關的問題。
我們的某些服務器始終保持正確的順序(仍然是隨機的),而有些則沒有。 完成重啟后,我發現了這一點。
HashSet
不能保證其中元素的順序,但這並不意味着順序將隨機更改。 元素的順序僅在需要重新計算散列時才會更改,並且僅在基礎哈希表的容量需要更改時才會發生。
Hash的容量何時更改的細節可能在不同的實現之間有所不同,但是可以保證,如果HashSet中的元素數除以HashSet的容量超過其loadFactor
,則HashSet的容量將增加。 每當容量增加時,所有元素的哈希碼都會重新計算,因此元素的順序可能會更改。
正如您說的那樣,您沒有覆蓋hashcode
方法,而是使用Object
類中的默認值。 javadoc說: 在合理可行的范圍內,由Object類定義的hashCode方法確實為不同的對象返回不同的整數。 (通常通過將對象的內部地址轉換為整數來實現,但是JavaTM編程語言不需要此實現技術。)
這意味着(假設您使用的是Oracle JVM或類似的JVM),對象的哈希碼將只是它們的內存地址。 這對於程序運行是固定的,但是對於不同的運行,它們肯定會有所不同,具體取決於程序的加載位置。 由於哈希函數不是單調的,因此HashSet中的順序將有所不同(但始終如Oliver Charlesworth所說是確定性的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.