hashcode爪喘,equals,和==之間的差別

HashCode

首先我們來理解下什么叫hash纠拔!Hash,一般翻譯做“散列”泛豪,也有直接音譯為"哈希"的稠诲,就是把任意長度的輸入(又叫做預(yù)映射, pre-image)诡曙,通過散列算法臀叙,變換成固定長度的輸出,該輸出就是散列值价卤。這種轉(zhuǎn)換是一種壓縮映射劝萤,也就是,散列值的空間通常遠(yuǎn)小于輸入的空間慎璧,不同的輸入可能會散列成相同的輸出床嫌,而不可能從散列值來唯一的確定輸入值跨释。

所以,面試的時候厌处,我們只需要說鳖谈,HashCode,就是對象通過散列算法生成的固定長度的值阔涉!

Equals缆娃,==

為啥我要拿Equals和==放在一起說,因?yàn)楹芎唵喂迮牛趯W(xué)校我們學(xué)的贯要,一般都是==是比較對象的引用地址的,而Equals是用來比較值的椭住,其實(shí)這特么是假的崇渗!因?yàn)槲覀兛丛创a就知道Object里面的Equals其實(shí)就是判斷==是否為true。為啥說equals值呢函荣,因?yàn)镋quals被重寫了啊显押。。傻挂。

Object.equals方法

HashCode乘碑,Equals,==三者的關(guān)系

1. 如果是基本變量金拒,沒有hashcode和equals方法兽肤,基本變量的比較方式就只有==,;

2. 如果是變量绪抛,由于在java中所有變量定義都是一個指向?qū)嶋H存儲的一個句柄(你可以理解為c++中的指針)资铡,在這里==是比較句柄的地址(你可以理解為指針的存儲地址),而不是句柄指向的實(shí)際內(nèi)存中的內(nèi)容幢码,如果要比較實(shí)際內(nèi)存中的內(nèi)容笤休,那就要用equals方法,但是V⒏薄5暄拧!

如果是你自己定義的一個類贞铣,比較自定義類用equals和==是一樣的闹啦,都是比較句柄地址,因?yàn)樽远x的類是繼承于object辕坝,而object中的equals就是用==來實(shí)現(xiàn)的窍奋,你可以看源碼。

那為什么我們用的String等等類型equals是比較實(shí)際內(nèi)容呢,是因?yàn)镾tring等常用類已經(jīng)重寫了object中的equals方法琳袄,讓equals來比較實(shí)際內(nèi)容江场,你也可以看源碼。

3. 從語法角度挚歧,也就是從強(qiáng)制性的角度來說扛稽,hashCode和equals是兩個獨(dú)立的,互不隸屬滑负,互不依賴的方法在张,equals成立與hashCode相等這兩個命題之間,誰也不是誰的充分條件或者必要條件矮慕。

但是帮匾,從為了讓我們的程序正常運(yùn)行的角度,我們應(yīng)當(dāng)向Effective? Java中所言

重載equals的時候痴鳄,一定要(正確)重載hashCode

使得equals成立的時候瘟斜,hashCode相等,也就是a.equals(b)->a.hashCode()? ==? b.hashCode()痪寻,或者說此時螺句,equals是hashCode相等的充分條件,hashCode相等是equals的必要條件(從數(shù)學(xué)課上我們知道它的逆否命題:hashCode不相等也不會equals)橡类,但是它的逆命題蛇尚,hashCode相等一定equals以及否命題不equals時hashCode不等都不成立。

總結(jié)

總結(jié)一下顾画,equals()是對象相等性比較取劫,hashCode()是計(jì)算對象的散列值,當(dāng)然他們的依據(jù)是對象的屬性研侣。

對于equals谱邪,一般我們認(rèn)為兩個對象同類型并且所有屬性相等的時候才是相等的,在類中必須改寫equals庶诡,因?yàn)镺bject類中的equals只是判斷兩個引用變量是否引用同一對象惦银,如果不是引用同一對象,即使兩個對象的內(nèi)容完全相同末誓,也會返回false扯俱。當(dāng)然,在類中改寫這個equals時基显,你也可以只對部分屬性進(jìn)行比較,只要這些屬性相同就認(rèn)為對象是相等的善炫。

對于hashCode撩幽,只要是用在和哈希運(yùn)算有關(guān)的地方,前面很多兄弟都提到了,和equals一樣窜醉,在你的類中也應(yīng)該改寫宪萄。當(dāng)然如果兩個對象是完全相同的,那么他們的hashCode當(dāng)然也是一樣的榨惰,但是象前面所述拜英,規(guī)則可以由你自己來定義,因此兩者之間并沒有什么必然的聯(lián)系琅催。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末居凶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子藤抡,更是在濱河造成了極大的恐慌侠碧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缠黍,死亡現(xiàn)場離奇詭異弄兜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瓷式,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門替饿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贸典,你說我怎么就攤上這事视卢。” “怎么了瓤漏?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵腾夯,是天一觀的道長。 經(jīng)常有香客問我蔬充,道長蝶俱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任饥漫,我火速辦了婚禮榨呆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庸队。我一直安慰自己积蜻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布彻消。 她就那樣靜靜地躺著竿拆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宾尚。 梳的紋絲不亂的頭發(fā)上丙笋,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天谢澈,我揣著相機(jī)與錄音,去河邊找鬼御板。 笑死锥忿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的怠肋。 我是一名探鬼主播敬鬓,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笙各!你這毒婦竟也來了钉答?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤酪惭,失蹤者是張志新(化名)和其女友劉穎希痴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體春感,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砌创,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鲫懒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫩实。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窥岩,靈堂內(nèi)的尸體忽然破棺而出甲献,到底是詐尸還是另有隱情,我是刑警寧澤颂翼,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布晃洒,位于F島的核電站,受9級特大地震影響朦乏,放射性物質(zhì)發(fā)生泄漏球及。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一呻疹、第九天 我趴在偏房一處隱蔽的房頂上張望吃引。 院中可真熱鬧,春花似錦刽锤、人聲如沸镊尺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庐氮。三九已至,卻和暖如春宋彼,著一層夾襖步出監(jiān)牢的瞬間弄砍,已是汗流浹背颅筋。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留输枯,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓占贫,卻偏偏與公主長得像桃熄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子型奥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

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