首先重寫equal方法必須重寫hashCode方法是通用的約定;如果不這么做,那么就無法使用hash算法的容器(hashMap、hashSet等)
Object規(guī)范的具體約定
- 如果沒有修改 equals 方法中用以比較的信息,在應(yīng)用程序的一次執(zhí)行過程中對一個對象重復(fù)調(diào)用 hashCode 方法時,它必須始終返回相同的值。在應(yīng)用程序的多次執(zhí)行過程中,每個執(zhí)行過程在該 對象上獲取的結(jié)果值可以不相同。
- 如果兩個對象根據(jù) equals(Object) 方法比較是相等的,那么在兩個對象上調(diào)用 hashCode 就必須產(chǎn)生的結(jié)果是相同的整數(shù)。
- 如果兩個對象根據(jù) equals(Object) 方法比較并不相等,則不要求在每個對象上調(diào)用 hashCode 都必須產(chǎn)生不同的結(jié)果。 但是,程序員應(yīng)該意識到,為不相等的對象生成不同的結(jié)果可能會提高散列 表(hash tables)的性能
hashCode的理解
- hashCode其實是一種對象上的標識,如果兩個對象相等,那么他們的對象標識一定是相等的;
比如 團隊2中小李說小張很優(yōu)秀,小王也說小張很優(yōu)秀;那么小張就是張三這個人的標識,這時候的兩個同事口中的小張是同一個人,那么相同的人標識是相同的;那么團隊2中的小張也很優(yōu)秀,這時候小張分別是兩個團隊的中張三和張四了;這時候不同的人標識是相同的
-
hashCode是一種壓縮算法(固定長度大小的int值標識對象)
因為對象很多,也是未知的;那么就是有限的長度標識無限的內(nèi)容了,肯定是標識不了所有對象,所以就導(dǎo)致了重復(fù)的存在(標識重復(fù),也就是hashCode重復(fù))