簡體   English   中英

在服務器停止之前,HashSet的隨機順序始終相同

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM