Object類中的equals和hashCode方法,你真的了解嗎?

2020-12-11 小碼哥編程學習

前言

在Java中,equals和hashCode方法是Object中提供的兩個方法,這兩個方法對以後的學習有很大的幫助,本文就深度來去講解這兩個方法。多說一句,我們直接從JDK的文檔來去解釋。

JDK中equals說明

equals方法解釋

下面的翻譯僅僅是對上面畫紅色的框中的內容進行解釋。

自反性 : x.equals(x) 結果應該返回true。 對稱性 : x.equals(y) 結果返回true若且唯若y.equals(x)也應該返回true。 傳遞性 : x.equals(y) 返回true,並且y.equals(z) 返回true,那麼x.equals(z) 也應該返回true。 一致性 : x.equals(y)的第一次調用為true,那麼x.equals(y)的第二次,第三次等多次調用也應該為true,但是前提條件是在進行比較之前,x和y都沒有被修改。 x.equals(null) 應該返回false。 這個方法返回true若且唯若x和y指向了同樣的對象(x==y),這句話也就是說明了在默認情況下,Object類中的equals方法默認比較的是對象的地址,因為只有是相同的地址才會相等(x == y),如果沒有重寫equals方法,那麼默認就是比較的是地址。注意:無論何時這個equals方法被重寫那麼都是有必要去重寫hashCode方法,這個是因為為了維持hashCode的一種約定,相同的對象必須要有相同的hashCode值。

JDK中hashCode說明

hashCode方法解釋

同樣是僅僅是挑重點,對紅色框中的內容解釋。

在同一次的java程序應用過程中,對應同樣的對象多次調用hashCode方法,hashCode方法必須一致性的返回同樣的一個地址值,前提是這個對象不能改變 兩個對象相同是依據equals方法來的,那麼其中的每一個對象調用hashCode方法都必須返回相同的一個integer值,也就是對象的地址。equals方法相等,那麼hashCode方法也必須相等。如果兩個對象依據equals方法返回的結果不相等,那麼對於其中的每一個對象調用hashCode方法返回的結果也不是一定必須得相等(也就是說,equals方法的結果為false,那麼hashCode方法返回的結果可以相同也可以不相同),但是,對於我們開發者來說,針對兩個對象的不相等如果生成相同的hashCode則可以提高應用程式的性能。

每日一題:

已知二叉樹後序遍歷序列是dabec,中序遍歷序列是debac,那麼問題是,它的前序遍歷序列是()

A. acbed

B. decab

C. deabc

D. cedba

相關焦點

  • Java中重寫equals方法為什麼要重寫hashcode方法?
    所有對象都有equals方法,默認是Object類的equals,其結果與==一樣。如果希望比較對象的值相同,必須重寫equals方法。hashCode與equals的區別Object中的equals:equals 方法要求滿足:自反性 a.equals(a)對稱性 x.equals(y
  • 詳解equals()方法和hashCode()方法
    equals()和hashCode()都不是final方法,都可以被重寫(overwrite)。本文介紹了2種方法在使用和重寫時,一些需要注意的問題。如果覺得文章對你有幫助,歡迎點讚或轉發。文章有疏漏之處,歡迎批評指正。
  • 『Java系列文章』2、淺談equals()和hashcode()
    所有的對象,包括數組,都實現了Object類中的定義的方法equals()方法詳解equals() 方法是用來判斷其他的對象是否和該對象相等equals() 方法在object類中定義如下:public boolean equals(Object obj) { return (this == obj); }
  • 乾貨 | 名企高頻考點-Java hashCode() 方法 和 equals() 方法
    在Java中存在兩個比較方法,分別是:hashCode() 方法 和 equals() 方法。這兩個方法都屬於Object類的方法。public boolean equals(Object obj) { return (this == obj); }public native int hashCode();你知道hashCode() 方法 和 equals() 方法嗎?
  • equals 和 hashCode 到底有什麼聯繫?一文告訴你!
    equals()和hashCode()都不是final方法,都可以被重寫(overwrite)。本文介紹了2種方法在使用和重寫時,一些需要注意的問題。通過該實現可以看出,Object類的實現採用了區分度最高的算法,即只要兩個對象不是同一個對象,那麼equals()一定返回false。
  • 為什麼要重寫 hashcode 和 equals 方法?
    hashcode方法?這裡講的理論知識並非無的放矢,大家能在後文裡清晰地了解到重寫hashCode方法的重要性。2. 為什麼要重寫equals和hashCode方法當我們用HashMap存入自定義的類時,如果不重寫這個自定義類的equals和hashCode方法,得到的結果會和我們預期的不一樣。我們來看WithoutHashCode.java這個例子。
  • Java為什麼重寫equals一定要重寫hashCode?
    初步探索首先我們要了解equals方法是什麼,hashcode方法是什麼。equals方法equals 是java的obejct類的一個方法,equals的源碼如下:由此我們可以看到equals是用來比較兩個對象的內存地址是否相等。
  • 重寫equals()時為什麼要重寫hashcode
    重寫equals()方法時,為什麼要重寫hashcode方法?1.==和equals()的區別(1)== 是比較運算符,equals()是在Object中定義的一個方法。另,運算符可以用於比較基本數據類型(如3==2),而方法是在「類」中定義的。因此,==運算符可以用於比較基本數據類型,但equals()不行。
  • 面試官問我:hashcode 是什麼?和equals是兄弟嗎?
    如果根據 equals(Object) 方法,兩個對象是相等的,那麼在兩個對象中的每個對象上調用 hashCode 方法都必須生成相同的整數結果。如果對象的 equals 方法被重寫,那麼對象的 hashCode 也儘量重寫,並且產生 hashCode 使用的對象,一定要和 equals 方法中使用的一致,剛剛提到的碰撞,指的是不同對象的 hashcode 處在同一個 bucket 當中,這個情況發生的概率越大說明這個 hashcode
  • 經典面試題:重寫equals方法時,為什麼必須重寫hashCode方法?
    今天給大家來個經典面試題:重寫equals方法時,為什麼必須重新hashCode方法?這2個方法位於Object類中,Object類是所有類的父類,所以如果你的類中沒有重寫這2個方法時,默認將使用Object中的這2個方法。
  • 淺談Java中的hashcode方法
    哈希表這個數據結構想必大多數人都不陌生,而且在很多地方都會利用到hash表來提高查找效率。在Java的Object類中有一個方法:public native int hashCode();根據這個方法的聲明可知,該方法返回一個int類型的數值,並且是本地方法,因此在Object類中並沒有給出具體的實現。
  • 淺談 Java 中的 hashcode 方法
    在Java的Object類中有一個方法:public native int hashCode();根據這個方法的聲明可知,該方法返回一個int類型的數值,並且是本地方法,因此在Object類中並沒有給出具體的實現。為何Object類需要這樣一個方法?它有什麼作用呢?今天我們就來具體探討一下hashCode方法。
  • Java面試題之為什麼要重寫hashcode( )和equals( )?
    好了,請看下題:為什麼要重寫hashcode( )和equals( )?打個比方,一個名叫張三的人去住酒店,在前臺登記完名字就去了99層100號房間,此時警察來前臺找叫張三的這個人住在哪間房,經過查詢,該酒店住宿的有50個叫張三的,需要遍歷查詢,查詢起來很不方便。
  • 「原創」不重寫equals和hashcode難道就不行嗎?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫究竟為什麼要重寫equals和hashcode???目錄1、equals()方法和hashCode()方法介紹1.1、equals()方法1.2、hashCode()方法
  • hashCode和identityHashCode的區別你知道嗎?
    /** * Returns the same hash code for the given object as * would be returned by the default method hashCode(), * whether or not the given object's class overrides
  • 不懂得hashcode的重要性,程序的性能會大打折扣
    第二種:自己重寫equals和hashcode,這就不一定了。這得看你自己怎麼寫hashcode了。如果不滿足這2點,相同的對象可以出現在Set集合中,同時增加新元素的效率會大大下降(對於使用哈希存儲的系統,如果哈希碼頻繁的衝突將會造成存取性能急劇下降)規則說完,就說下為什麼hashcode會影響性能吧(重點,面試目的就是問他)大家都知道hashCode()方法給對象返回一個hashcode值,而這個值是用來幹什麼的,有人知道嗎,知道證明你還是了解些的。
  • Java hashCode() 方法深入理解
    Java.lang.Object 有一個hashCode()和一個equals()方法,這兩個方法在軟體設計中扮演著舉足輕重的角色。
  • java工程師必知必會的 hashcode 和 hash 算法!
    前言作為一個有抱負的 Java 程式設計師,在經過長期的CRUD 和 HTML 填空之後必須有所思考,因為好奇心是驅動人類進步的動力之一我們好奇,比如我們常用的 HashMap 到底是如何實現的?我想,說到這裡,稍微有點經驗的大佬都會說:擦,面試必問好嘛?怎麼可能不知道?但是,我們真的了解他嗎?
  • 簡單的理解集合中的HashSet和HashTree幾個重寫方法
    面試中相信小夥伴都會遇到這個問題,我們快來了解下HashSet和HashTree重寫機制吧!!!Java中的set是無序的,但是是不可重複的HashSet底層是哈希表,通過調用hashcode和equals方法實現去重當我們HashSet裡面存的是字符串時,就能默認去重了,因為String已經重寫了hashcode和euqals方法public static void main(String[] args) {HashSet
  • equals方法
    今天主要來講java中的equals方法1.equals是一個方法而非運算符,所以只使用於引用數據類型。