為什么覆蓋equals時總要覆蓋hashcode

所有的對象都繼承自O(shè)bject,equals方法是Object中的public方法肯骇。我們可以重寫它。默認(rèn)的equals方法是比較兩個對象中的內(nèi)存地址叁执,而hashCode的值是根據(jù)對象的地址計算得到的(This is typically implemented by converting the internal address of the object into an integer)捶码。如果你要override equals方法時揉忘,那你也必須要override hashCode方法破停。如果不重寫的話陷嘴,就會違反Object.hashcode的通用約定骇扇,違反的是下面第二條的約定摔竿,如果兩個對象的equals方法比較相同,那么對象的hashCode方法也相同少孝。違反這條約定會導(dǎo)致該類無法結(jié)合所有基于散列的集合一起正常工作继低,這樣的集合包括HashMap、HashSet和Hashtable稍走。

那你可能又會問了袁翁,hashCode怎么就影響了對象在Hash集合中的使用呢?
因為HashMap中有一項優(yōu)化婿脸,可以將與每個項相關(guān)聯(lián)的散列碼緩存起來粱胜,如果散列碼不匹配,也不必檢驗對象的等同性狐树。

  int hash = (key == null) ? 0 : sun.misc.Hashing.singleWordWangJenkinsHash(key);
        for (HashMapEntry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }

下面約定的內(nèi)容是:

  • 在應(yīng)用程序執(zhí)行期間焙压,只要對象的equals方法的比較操作所用到的信息沒有修改,那么對同一對象調(diào)用多次抑钟,hashCode方法必須始終如一的返回同一個整數(shù)涯曲。在同一個應(yīng)用程序的多次執(zhí)行過程中,每次執(zhí)行返回的整數(shù)可以不一致在塔。
  • 如果兩個對象根據(jù)equals方法比較是相同的幻件,那么調(diào)用這兩個對象中任意一個對象的hashCode方法都必須產(chǎn)生同樣的整數(shù)結(jié)果。
  • 如果兩個對象根據(jù)equals方法比較是不相等的心俗,那么調(diào)用這兩個對象中任意一個hashCode方法傲武,則不一定產(chǎn)生不同的整數(shù)結(jié)果蓉驹。但是程序員應(yīng)該知道,給不相等的對象產(chǎn)生截然不同的整數(shù)結(jié)果揪利,有可能提高h(yuǎn)ashtable 的性能态兴。

拓展學(xué)習(xí):Hash表的存儲結(jié)構(gòu)。
理解了Hash表的存儲結(jié)構(gòu)疟位,會對上面的內(nèi)容有更深入的理解瞻润。
哈希表最常實現(xiàn)的方法是拉鏈法,可以理解為鏈表的數(shù)組甜刻,數(shù)組中的每個單元存放的是鏈表的首節(jié)點绍撞。

hashtable.png

那這些元素按照什么樣的規(guī)則存放在數(shù)組中呢?一般情況下通過hash(key)%len獲得得院,也就是元素key的hash值對數(shù)組長度取模得到的傻铣。
這就是為什么第三個約定中說到,給不想等的對象產(chǎn)生截然不同的整數(shù)結(jié)果祥绞,有可能提高h(yuǎn)ashtable的性能非洲。理想情況下,散列函數(shù)應(yīng)該把集合中不相等的實例均勻地分布到所有的散列值中蜕径。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末两踏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兜喻,更是在濱河造成了極大的恐慌梦染,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朴皆,死亡現(xiàn)場離奇詭異帕识,居然都是意外死亡,警方通過查閱死者的電腦和手機车荔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門渡冻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戚扳,“玉大人忧便,你說我怎么就攤上這事∶苯瑁” “怎么了珠增?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砍艾。 經(jīng)常有香客問我蒂教,道長,這世上最難降的妖魔是什么脆荷? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任凝垛,我火速辦了婚禮懊悯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梦皮。我一直安慰自己炭分,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布剑肯。 她就那樣靜靜地躺著捧毛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪让网。 梳的紋絲不亂的頭發(fā)上呀忧,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天,我揣著相機與錄音溃睹,去河邊找鬼而账。 笑死,一個胖子當(dāng)著我的面吹牛因篇,可吹牛的內(nèi)容都是我干的福扬。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼惜犀,長吁一口氣:“原來是場噩夢啊……” “哼铛碑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起虽界,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤汽烦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后莉御,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撇吞,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年礁叔,在試婚紗的時候發(fā)現(xiàn)自己被綠了牍颈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡琅关,死狀恐怖煮岁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涣易,我是刑警寧澤画机,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站新症,受9級特大地震影響步氏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜徒爹,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一荚醒、第九天 我趴在偏房一處隱蔽的房頂上張望芋类。 院中可真熱鬧,春花似錦界阁、人聲如沸梗肝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巫击。三九已至,卻和暖如春精续,著一層夾襖步出監(jiān)牢的瞬間坝锰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工重付, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留顷级,地道東北人。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓确垫,卻偏偏與公主長得像弓颈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子删掀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容