轉(zhuǎn)帖|其它|編輯:郝浩|2010-06-11 10:17:50.000|閱讀 644 次
概述:在Java語言中,equals()和hashCode()兩個(gè)函數(shù)的使用是緊密配合的,你要是自己設(shè)計(jì)其中一個(gè),就要設(shè)計(jì)另外一個(gè)。在多數(shù)情況 下,這兩個(gè)函數(shù)是不用考慮的,直接使用它們的默認(rèn)設(shè)計(jì)就可以了。但是在一些情況下,這兩個(gè)函數(shù)最好是自己設(shè)計(jì),才能確保整個(gè)程序的正常運(yùn)行。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
前言
在Java語言中,equals()和hashCode()兩個(gè)函數(shù)的使用是緊密配合的,你要是自己設(shè)計(jì)其中一個(gè),就要設(shè)計(jì)另外一個(gè)。在多數(shù)情況 下,這兩個(gè)函數(shù)是不用考慮的,直接使用它們的默認(rèn)設(shè)計(jì)就可以了。但是在一些情況下,這兩個(gè)函數(shù)最好是自己設(shè)計(jì),才能確保整個(gè)程序的正常運(yùn)行。最常見的是當(dāng) 一個(gè)對(duì)象被加入收集對(duì)象(collection object)時(shí),這兩個(gè)函數(shù)必須自己設(shè)計(jì)。更細(xì)化的定義是:如果你想將一個(gè)對(duì)象A放入另一個(gè)收集對(duì)象B里,或者使用這個(gè)對(duì)象A為查找一個(gè)元對(duì)象在收集對(duì) 象B里位置的鑰匙,并支持是否容納,刪除收集對(duì)象B里的元對(duì)象這樣的操作,那么,equals()和hashCode()函數(shù)必須開發(fā)者自己定義。其他情 況下,這兩個(gè)函數(shù)是不需要定義的。
equals
它是用于進(jìn)行兩個(gè)對(duì)象的比較的,是對(duì)象內(nèi)容的比較,當(dāng)然也能用于進(jìn)行對(duì)象參閱值的比較。什么是對(duì)象參閱值的比較?就是兩個(gè)參閱變量的值得比較,我們 都知道參閱變量的值其實(shí)就是一個(gè)數(shù)字,這個(gè)數(shù)字可以看成是鑒別不同對(duì)象的代號(hào)。兩個(gè)對(duì)象參閱值的比較,就是兩個(gè)數(shù)字的比較,兩個(gè)代號(hào)的比較。這種比較是默 認(rèn)的對(duì)象比較方式,在Object這個(gè)對(duì)象中,這種方式就已經(jīng)設(shè)計(jì)好了。所以你也不用自己來重寫,浪費(fèi)不必要的時(shí)間。
對(duì)象內(nèi)容的比較才是設(shè)計(jì)equals()的真正目的,Java語言對(duì)equals()的要求如下,這些要求是必須遵循的。否則,你就不該浪費(fèi)時(shí)間:
對(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”。
hashCode
這 個(gè)函數(shù)返回的就是一個(gè)用來進(jìn)行赫希操作的整型代號(hào),請(qǐng)不要把這個(gè)代號(hào)和前面所說的參閱變量所代表的代號(hào)弄混了。后者不僅僅是個(gè)代號(hào)還具有在內(nèi)存中才查找對(duì) 象的位置的功能。hashCode()所返回的值是用來分類對(duì)象在一些特定的收集對(duì)象中的位置。這些對(duì)象是HashMap, Hashtable, HashSet,等等。這個(gè)函數(shù)和上面的equals()函數(shù)必須自己設(shè)計(jì),用來協(xié)助HashMap, Hashtable, HashSet,等等對(duì)自己所收集的大量對(duì)象進(jìn)行搜尋和定位。
這些收集對(duì)象究竟如何工作的,想象每個(gè)元對(duì)象hashCode是一個(gè)箱子的 編碼,按照編碼,每個(gè)元對(duì)象就是根據(jù)hashCode()提供的代號(hào)歸入相應(yīng)的箱子里。所有的箱子加起來就是一個(gè)HashSet,HashMap,或 Hashtable對(duì)象,我們需要尋找一個(gè)元對(duì)象時(shí),先看它的代碼,就是hashCode()返回的整型值,這樣我們找到它所在的箱子,然后在箱子里,每 個(gè)元對(duì)象都拿出來一個(gè)個(gè)和我們要找的對(duì)象進(jìn)行對(duì)比,如果兩個(gè)對(duì)象的內(nèi)容相等,我們的搜尋也就結(jié)束。這種操作需要兩個(gè)重要的信息,一是對(duì)象的 hashCode(),還有一個(gè)是對(duì)象內(nèi)容對(duì)比的結(jié)果。
hashCode()的返回值和equals()的關(guān)系如下:
如果x.equals(y)返回“true”,那么x和y的hashCode()必須相等。
如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載