正確重寫hashCode方法


https://blog.csdn.net/HD243608836/article/details/87367763

到這里,對象寫完了,開始描述問題。

計算hashCode的注意事項:

1、不能包含equals方法中沒有的字段,否則會導致相等的對象可能會有不同的哈希值。

    (即對類中每一個重要字段,也就是影響對象的值的字段,也就是equals方法里有比較的字段,進行操作)

2、String對象和Bigdecimal對象已經重寫了hashcode方法,這些類型的值可以直接用於重寫hashcode方法;

3、result = 31 *result + (dishCode !=null ?dishCode.hashCode() : 0);,這里面為啥用個31來計算,而且很多人都是這么寫的,這是因為31是個神奇的數字,任何數n*31都可以被jvm優化為(n<<5)-n,移位和減法的操作效率比乘法的操作效率高很多!

4、Google首席Java架構師Joshua Bloch在他的著作《Effective Java》中提出了一種簡單通用的hashCode算法:

     ①初始化一個整形變量,為此變量賦予一個非零的常數值,比如int result = 17;

     ②如果是對象應用(例如有String類型的字段),如果equals方法中采取遞歸調用的比較方式,那么hashCode中同樣采取遞歸調用hashCode的方式。否則需要為這個域計算一個范式,比如當這個域的值為null的時候(即 String a = null 時),那么hashCode值為0

 

例二:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM