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
例二: