列舉的hashcode跨JVM不穩定

2021-08-25 20:42:15 字數 699 閱讀 8710

碰到的問題: 在工程中試圖給你乙個pojo新增乙個版本號的屬性,由於考慮時間因素因此選擇了用這個物件的一些屬性的hashcode作為版本號,如果那些屬性都沒有改變那麼這個hashcode不應該改變,反之則改變. 在這些屬性中偏巧..有一些是列舉型別. 在測試中發現,如果使用同乙個jvm一直呼叫程式,那麼該hashcode一直相同,但是如果重啟伺服器,開新的jvm,那麼這個hashcode將會改變,即使對應的object的任何屬性都沒有改變.這就是列舉的hashcode跨jvm不穩定.

調查發現: 在jdk中的enum.class中 hashcode方法是final的並且直接呼叫父類object.class的hashcode方法

/*** returns a hash code for this enum constant.

** @return a hash code for this enum constant.

*/public final int hashcode()

這樣,列舉的hashcode就和記憶體位址掛鉤也就可能會產生不穩定.google了下這個問題,已經有人給oracle提出bug要求將上面的方法去掉final修飾,不過oracle拒絕了 - -

個人目前的解決方法是呼叫列舉的name()方法將其轉化為string,string的hashcode是穩定的.

乙個記錄.

HashCode的利與弊

hashcode是怎麼來的?將物件實體地址轉換成乙個整數,然後該整數通過hash函式的演算法就得到了hashcode。該整數和hashcode是對應的,而物件的實體地址和該整數也是對應的。所以,物件的實體地址,整數,hashcode是一種對映關係。查詢效率高!為什麼查詢效率高?因為採用雜湊表,也就是...

Java equals和hashCode的理解

我們一般使用equals都是為了比較物件的內容,而object裡面的equals方法卻是比較物件的引用,如下 public boolean equals object obj 所以當我們想要比較的是物件的內容時,需要重寫equals方法,假設user類中有string name int age 兩個...

java Object類的hashCode方法

1 返回該物件的雜湊碼值。預設情況下,該方法會根據物件的位址來計算。2 不同物件的,hashcode 一般來說不會相同。但是,同乙個物件的hashcode 值肯定相同。下方 public class demo1 hashcode 執行結果 366712642 366712642 1829164700...