1、hashCode方法返回值是int類型的散列碼,對象的散列碼是為了更好的支持基于哈希機制的java集合類,例如Hashtable,HashMap,HashSet。如果重寫equals方法,也要重寫hashCode方法。
2、hashCode方法的一致約定要求
(1)、 在java應用的一次執(zhí)行過程中,對于同一個對象的hashCode方法的多次調(diào)用,他們應該返回同樣的值(前提是該對象的信息沒有發(fā)生變化);
(2)、對于兩個對象來說,如果使用equals方法比較返回true,那么這兩個對象的hashCode值一定是相同的;
(3) 對于兩個對象來說,如果使用equals方法返回false,那么這兩個對象的hashCode值不要求一定不同(可以相同,可以不同),但是如果不同則可以提高應用的性能。
(4)、 對于Object類來說,不同Object對象的hashCode值是不同的(Object類的hashcode值表示的是對象的地址)。
3、 hashCode方法應用舉例:
當使用HashSet時,hashCode()方法就會得到調(diào)用,判斷已經(jīng)存儲在集合對象中的hashCode值是否與增加的對象的hashCode值一致;如果不一致,直接加進去;如果一致,在進行equals方法比較,equals方法返回true,表示對象已經(jīng)加進去了,就不會再增加新的對象,否則加進去。
4、hashCode編寫指導
在編寫hashCode時,由于返回值是個int值,故不能溢出。不同對象的hash盡量不同,避免hash沖突。下面是解決方案:
- 定義一個int類型的變量hash,初始化為7。
- 接下來將你認為重要的字段(equals中衡量相等的字段)參與散列運算,每一個重要字段都會產(chǎn)生一個hash分量,為最終的hash值做出貢獻
image.png
- 最后通過遞歸計算所有的分量的總和起,注意并不是簡單的相加。選擇一個倍乘的數(shù)字31,參與計算。
int hash = 7;
hash = 31 * hash + 字段1貢獻分量;
hash = 31 * hash + 字段2貢獻分量;
.....
return hash;
注釋以上部分內(nèi)容來自:
lulipro