更新時(shí)間:2020-08-26 15:25:27 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2404次
equals源碼分析
?/**
?????*?@param???obj???the?reference?object?with?which?to?compare.
?????*?@return??{@code?true}?if?this?object?is?the?same?as?the?obj
?????*??????????argument;?{@code?false}?otherwise.
?????*?@see?????#hashCode()
?????*?@see?????java.util.HashMap
?????*/
????public?boolean?equals(Object?obj)?{
????????return?(this?==?obj);
????}
上面簡(jiǎn)單的三行代碼就是Object類中equals的源碼。主要的比較是兩個(gè)對(duì)象的地址??梢钥吹剑椒w中equals比較其實(shí)也是“==”實(shí)現(xiàn)的。因此,下次在面試的過程中,你遇見問equals與“==”的區(qū)別的時(shí)候,你先給出結(jié)論。==是比較兩個(gè)對(duì)象地址的,沒有重寫equals方法的實(shí)體類使用equals也是比較地址的。
那么我們經(jīng)常用String中equals為什么是比較值的呢?接下來我們看一下String類中equals的源碼
String中equals方法源碼分析
/**?
?????*@param??anObject
?????*?????????The?object?to?compare?this?{@code?String}?against
?????*
?????*?@return??{@code?true}?if?the?given?object?represents?a?{@code?String}
?????*??????????equivalent?to?this?string,?{@code?false}?otherwise
?????*
?????*?@see??#compareTo(String)
?????*?@see??#equalsIgnoreCase(String)
?????*/
????public?boolean?equals(Object?anObject)?{
??????//可以看到,String中重新的equals方法在第一步就進(jìn)行了地址比較,
??????//如果兩個(gè)字符串的地址相等,那么他們的值一定相等,就不用去進(jìn)行下面的值比較了
????????if?(this?==?anObject)?{
????????????return?true;
????????}
??????//這個(gè)if表示,如果equals的方法體中不是一個(gè)String類型,那么也就直接返回為false
??????//比如“蜜蜂攻城獅
????????if?(anObject?instanceof?String)?{
????????????String?anotherString?=?(String)anObject;
????????????int?n?=?value.length;
????????????if?(n?==?anotherString.value.length)?{
????????????????char?v1[]?=?value;
????????????????char?v2[]?=?anotherString.value;
????????????????int?i?=?0;
????????????????while?(n--?!=?0)?{
????????????????????if?(v1[i]?!=?v2[i])
????????????????????????return?false;
????????????????????i++;
????????????????}
????????????????return?true;
????????????}
????????}
????????return?false;
????}
在我們實(shí)際編寫代碼的時(shí)候,特別是一些需要重寫equals方法的實(shí)體類的時(shí)候,那么我們需要進(jìn)行equals的方法重寫,重寫equals方法需要遵守如下約定。翻譯如下

(1)自反性:x.equals(x)必須返回true。
(2)對(duì)稱性:x.equals(y)與y.equals(x)的返回值必須相等。
(3)傳遞性:x.equals(y)為true,y.equals(z)也為true,那么x.equals(z)必須為true。
(4)一致性:如果對(duì)象x和y在equals()中使用的信息都沒有改變,那么x.equals(y)值始終不變。
(5)非null:x不是null,y為null,則x.equals(y)必須為false。
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“你應(yīng)該學(xué)會(huì)的Java源碼學(xué)習(xí)”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)