HashCode和equal方法的區(qū)別和聯(lián)系

equals()反映的是對象或變量具體的值熬荆,即兩個對象里面包含的值--可能是對象的引用渐排,也可能是值類型的值。
而hashCode()是對象或變量通過哈希算法計算出的哈希值。
之所以有hashCode方法集币,是因為在批量的對象比較中,hashCode要比equals來得快翠忠,很多集合都用到了hashCode鞠苟,
比如HashTable。

兩個obj,如果equals()相等当娱,hashCode()一定相等吃既。
兩個obj,如果hashCode()相等跨细,equals()不一定相等(Hash散列值有沖突的情況鹦倚,雖然概率很低)。

所以:

可以考慮在集合中冀惭,判斷兩個對象是否相等的規(guī)則是:

第一步震叙,如果hashCode()相等,則查看第二步散休,否則不相等;
第二步媒楼,查看equals()是否相等,如果相等戚丸,則兩obj相等划址,否則還是不相等。

  • 首先equals()和hashcode()這兩個方法都是從object類中繼承過來的限府。

equals()是對兩個對象的地址值進行的比較(即比較引用是否相同)夺颤。

hashCode()是一個本地方法,它的實現(xiàn)是根據(jù)本地機器相關(guān)的胁勺。

  • Java語言對equals()的要求如下拂共,這些要求是必須遵循的:

    • 對稱性:如果x.equals(y)返回是true,那么y.equals(x)也應(yīng)該返回是true姻几。

    • 反射性:x.equals(x)必須返回是true宜狐。

    • 類推性:如果x.equals(y)返回是true,而且y.equals(z)返回是true蛇捌,那么z.equals(x)也應(yīng)該返回是true抚恒。

    • 一致性:如果x.equals(y)返回是true,只要x和y內(nèi)容一直不變络拌,不管你重復x.equals(y)多少次俭驮,返回都是true。

    • 任何情況下春贸,x.equals(null)混萝,永遠返回是false;x.equals(和x不同類型的對象)永遠返回是false萍恕。

  • equals()相等的兩個對象逸嘀,hashcode()一定相等;反過來:hashcode()不等允粤,一定能推出equals()也不等崭倘;
    hashcode()相等翼岁,equals()可能相等,也可能不等司光。

1琅坡、 為什么要重載equal方法?

答案:因為Object的equal方法默認是兩個對象的引用的比較残家,意思就是指向同一內(nèi)存,地址則相等榆俺,否則不相等;如果你現(xiàn)在需要利用對象里面的值來判斷是否相等坞淮,則重載equal方法谴仙。

2、 為什么重載hashCode方法碾盐?

答案:一般的地方不需要重載hashCode晃跺,只有當類需要放在HashTable、HashMap毫玖、HashSet等等hash結(jié)構(gòu)的集合時才會重載hashCode掀虎,那么為什么要重載hashCode呢?就HashMap來說付枫,好比HashMap就是一個大內(nèi)存塊烹玉,里面有很多小內(nèi)存塊,小內(nèi)存塊里面是一系列的對象阐滩,可以利用hashCode來查找小內(nèi)存塊hashCode%size(小內(nèi)存塊數(shù)量)二打,所以當equal相等時,hashCode必須相等掂榔,而且如果是object對象继效,必須重載hashCode和equal方法。

3装获、 為什么equals()相等瑞信,hashCode就一定要相等,而hashCode相等穴豫,卻不要求equals相等?

答案:1凡简、因為是按照hashCode來訪問小內(nèi)存塊,所以hashCode必須相等精肃。

2秤涩、HashMap獲取一個對象是比較key的hashCode相等和equal為true。

之所以hashCode相等司抱,卻可以equal不等筐眷,就比如ObjectA和ObjectB他們都有屬性name,那么hashCode都以name計算状植,所以hashCode一樣浊竟,但是兩個對象屬于不同類型怨喘,所以equal為false津畸。

4振定、 為什么需要hashCode?

1、通過hashCode可以很快的查到小內(nèi)存塊肉拓。
2后频、通過hashCode比較比equal方法快,當get時先比較hashCode暖途,如果hashCode不同卑惜,直接返回false。

hashCode()的作用

參考

HashCode和equal方法的區(qū)別和聯(lián)系(一)
HashCode和equal方法的區(qū)別和聯(lián)系(二)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驻售,一起剝皮案震驚了整個濱河市露久,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欺栗,老刑警劉巖毫痕,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異迟几,居然都是意外死亡消请,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門劳曹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扔水,“玉大人缔御,你說我怎么就攤上這事「滋樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵厂抽,是天一觀的道長察滑。 經(jīng)常有香客問我,道長修肠,這世上最難降的妖魔是什么贺辰? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮嵌施,結(jié)果婚禮上饲化,老公的妹妹穿的比我還像新娘。我一直安慰自己吗伤,他們只是感情好吃靠,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著足淆,像睡著了一般巢块。 火紅的嫁衣襯著肌膚如雪礁阁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天族奢,我揣著相機與錄音姥闭,去河邊找鬼。 笑死越走,一個胖子當著我的面吹牛棚品,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播廊敌,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铜跑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了骡澈?” 一聲冷哼從身側(cè)響起锅纺,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肋殴,沒想到半個月后囤锉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡疼电,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年嚼锄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔽豺。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡区丑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出修陡,到底是詐尸還是另有隱情沧侥,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布魄鸦,位于F島的核電站宴杀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拾因。R本人自食惡果不足惜旺罢,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绢记。 院中可真熱鬧扁达,春花似錦、人聲如沸蠢熄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽签孔。三九已至叉讥,卻和暖如春窘行,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背图仓。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工罐盔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人透绩。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓翘骂,卻偏偏與公主長得像壁熄,于是被迫代替她去往敵國和親帚豪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

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