一、官方定義
hashCode 的常規(guī)協(xié)定是:
在Java 應(yīng)用程序執(zhí)行期間,在同一對(duì)象上多次調(diào)用 hashCode 方法時(shí),必須一致地返回相同的整數(shù),前提是對(duì)象上 equals 比較中所用的信息沒有被修改排嫌。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行,該整數(shù)無需保持一致缰犁。
如果根據(jù) equals(Object) 方法淳地,兩個(gè)對(duì)象是相等的怖糊,那么在兩個(gè)對(duì)象中的每個(gè)對(duì)象上調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果。
以下情況不是必需的:如果根據(jù) equals(java.lang.Object) 方法颇象,兩個(gè)對(duì)象不相等伍伤,那么在兩個(gè)對(duì)象中的任一對(duì)象上調(diào)用 hashCode 方法必定會(huì)生成不同的整數(shù)結(jié)果。但是遣钳,程序員應(yīng)該知道扰魂,為不相等的對(duì)象生成不同整數(shù)結(jié)果可以提高哈希表的性能。
實(shí)際上蕴茴,由 Object 類定義的 hashCode 方法確實(shí)會(huì)針對(duì)不同的對(duì)象返回不同的整數(shù)劝评。(這一般是通過將該對(duì)象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)來實(shí)現(xiàn)的,但是 JavaTM 編程語言不需要這種實(shí)現(xiàn)技巧倦淀。)
當(dāng)equals方法被重寫時(shí)付翁,通常有必要重寫 hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定晃听,該協(xié)定聲明相等對(duì)象必須具有相等的哈希碼。
二砰识、個(gè)人理解hashcode
1.Object類的hashCode:返回對(duì)象的內(nèi)存地址經(jīng)過處理后的結(jié)構(gòu)能扒,由于每個(gè)對(duì)象的內(nèi)存地址都不一樣,所以哈希碼也不一樣辫狼。兩個(gè)對(duì)象要完全相同必須哈希值一樣初斑。比較用equal()方法
任何類均為Object類的間接子類,所以均繼承方法public int hashCode()膨处,該方法返回的值一般是通過將該對(duì)象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)來實(shí)現(xiàn)的见秤。這樣能保證每個(gè)對(duì)象的哈希碼值不一樣
這里的地址是指JVM虛擬出來的內(nèi)存地址,不是實(shí)際物理內(nèi)存地址真椿。
哈希值和地址值是不一樣的鹃答,哈希值是通過哈希算法散列得來的,而地址值和物理層面有關(guān)突硝,是系統(tǒng)分配的测摔,是不存在相同的,而哈希值是可以通過強(qiáng)制手段設(shè)置為相同的解恰,也就是說哈希值是一種邏輯上的確保唯一性锋八,而地址值就是物理上確保唯一性。
三护盈、對(duì)象放入散列集合的流程圖
四挟纱、總結(jié)
1.hashCode是為了提高在散列結(jié)構(gòu)存儲(chǔ)中查找的效率,在線性表中沒有作用腐宋。
2.equals和hashCode需要同時(shí)覆蓋紊服。
3.若兩個(gè)對(duì)象equals返回true檀轨,則hashCode有必要也返回相同的int數(shù)。
4.若兩個(gè)對(duì)象equals返回false围苫,則hashCode不一定返回不同的int數(shù),但為不相等的對(duì)象生成不同hashCode值可以提高 哈希表的性能裤园。
5.若兩個(gè)對(duì)象hashCode返回相同int數(shù),則equals不一定返回true剂府。
6.若兩個(gè)對(duì)象hashCode返回不同int數(shù)拧揽,則equals一定返回false。
7.同一對(duì)象在執(zhí)行期間若已經(jīng)存儲(chǔ)在集合中腺占,則不能修改影響hashCode值的相關(guān)信息淤袜,否則會(huì)導(dǎo)致內(nèi)存泄露問題。