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