這篇文章主要介紹“Java中的equals()、==和hashCode()的用法區(qū)別”,在日常操作中,相信很多人在Java中的equals()、==和hashCode()的用法區(qū)別問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中的equals()、==和hashCode()的用法區(qū)別”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、龍川網(wǎng)絡(luò)推廣、微信小程序開發(fā)、龍川網(wǎng)絡(luò)營銷、龍川企業(yè)策劃、龍川品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供龍川建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com
equals()
equals() 的作用是用來判斷兩個對象是否相等。它定義在 JDK 的 Object 類中。源碼如下:
由于 Object 類是所有類基類,所以所有的 Java 類都有 equals() 方法。只不過默認(rèn)的 equals() 方法,等價于 ==。Object 類中的 equals() 方法默認(rèn)是通過判斷兩個對象的地址是否相等(即,是否是同一個對象)來區(qū)分它們是否相等的。
因此,我們通常會重寫 equals() 方法。若某個類沒有覆蓋 equals() 方法,當(dāng)通過它的 equals() 比較兩個對象時,實(shí)際上是比較兩個對象是不是同一個對象。這時,等價于通過“==”去比較這兩個對象。當(dāng)我們覆蓋了類的 equals() 方法后,通過 equals() 方法比較兩個對象是否相等。比較的是兩個對象的內(nèi)容相等,若相等則 equals() 方法返回 true;否則返回 fasle。
Java 的 equals() 有 5 大特性:
對稱性:如果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)容一直不變,不管你重復(fù)x.equals(y)多少次,返回都是"true"。
非空性:x.equals(null),永遠(yuǎn)返回是"false";x.equals(和 x 不同類型的對象)永遠(yuǎn)返回是"false"。
所以,我們在重寫 equals() 方法的時候,一定要檢驗(yàn)檢驗(yàn)是否達(dá)到了上面的 5 大特性。這 5 大特性也被稱為 equals() 的 5 大重寫規(guī)則。
==
== 的作用是判斷兩個對象的地址是不是相等。即,判斷兩個對象是不試同一個對象。
面試的時候,基本上都會問到 equals 方法與‘==’運(yùn)算符有什么區(qū)別?如果你回答的是:“equals 比較的是對象的內(nèi)容,而‘==’比較的是對象的地址”。那么這個答案嚴(yán)格來說是錯誤的,至少是不完全正確吧。
通過前面的內(nèi)容我們知道 equals 方法在 Object 中的實(shí)現(xiàn)也是直接的使用了‘==’運(yùn)算符進(jìn)行比較的。所以回答這個問題一定要嚴(yán)謹(jǐn),加上前置條件。
hashCode()
hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實(shí)際上是返回一個 int 整數(shù)。一般在 hash 集合中會用到。hashCode() 統(tǒng)一定義在 JDK 的 Object 中,這就意味著 Java 中的任何類都包含有 hashCode() 函數(shù)。
那么為什么重寫 equals() 的同時還得重寫 hashCode() 呢?就是因?yàn)?HashMap,Hashtable,HashSet 等集合在處理鍵對象的哈希碼來計(jì)算存儲位置的時,并不能保證 hash 不沖突。另外在 equals() 方法相等的時候,hashCode() 也不一定相等。
但是在使用散列表時,我們要求如果兩個對象的 equals() 相等,那么它們的 hashCode() 的話, 值一定相同。如果兩個對象 hashCode() 相等,它們的 equals() 并不一定相等。
因?yàn)樵谏⒘斜碇?,hashCode() 相等,即兩個鍵值對的哈希值相等。然而哈希值相等,并不一定能得出鍵值對相等。補(bǔ)充說一句:“兩個不同的鍵值對,哈希值相等”,這就是哈希沖突。
我們知道 HashSet 是一個不允許存儲重復(fù)元素的集合,但是如果你沒有重寫元素類的 equals() 和 hashCode() 的話,HashSet 基本上就失去了意義。這也是為什么很多同學(xué)誤用 HashSet,但并沒有用出自己想要的結(jié)果的原因。
到此,關(guān)于“Java中的equals()、==和hashCode()的用法區(qū)別”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!