課程
/后端開發(fā)
/Java
/Java入門第二季 升級(jí)版
類的比較是指存儲(chǔ)地址的比較,那兩個(gè)字符串的比較是值的比較還是地址的比較?
2016-07-04
源自:Java入門第二季 升級(jí)版 9-9
正在回答
首先,從你的問題就開始,你說類的比較是指存儲(chǔ)地址的比較,這句話是不對(duì)的。因?yàn)?,在沒有重寫equals之前,你使用equals方法,確實(shí)是比較地址的,這是因?yàn)閑quals屬于object這個(gè)老祖宗(基類)內(nèi)的方法,初始化后的作用就是比較地址的,但是問題來了,除非你一個(gè)new出來的對(duì)象,否則肯定都為false,因?yàn)槟忝縩ew一個(gè),出來的都是開辟一個(gè)新的空間。而java所提供的類中,有的重寫了equals方法,所以最后如String,Integer,Date在這些類當(dāng)中equals有其自身的實(shí)現(xiàn),而不再是比較類在的存放地址了。如果當(dāng)此類是你自定義的類,你可以根據(jù)需求去重寫equals方法。就是課堂里的重寫了一個(gè)多重比較的equals方法:先比較地址,如果一樣,就返回true;再比較空對(duì)象,為false;再比較類對(duì)象,不同為false;相同了就繼續(xù)比較屬性值,相同為true,不同為false。其次,第二個(gè)問題,String的比較,這個(gè)看你的String是new出來的還是直接賦值來的:首先是String c=“hello”方式,這種方式,優(yōu)先去“字符串緩沖池”中尋找這個(gè)“hello”字符串是否被創(chuàng)建了,如果有,就指向它;如果沒有則開辟空間創(chuàng)建;也就是相當(dāng)于String c=new String("hello");
下面java提供的String類中的equals方法:
public?boolean?equals(Object?anObject)?{ ????if?(this?==?anObject)?{//地址相同返回true,如不同繼續(xù)比較 ????????return?true; ????} ????if?(anObject?instanceof?String)?{?//是否是String的實(shí)例?如果是繼續(xù)判斷,否則返回false; ????????//下面的代碼就是講anObject轉(zhuǎn)換成字符數(shù)組,然后逐位比較是否相同,不同返回false,相同返回true; ????????String?anotherString?=?(String)anObject; ????????int?n?=?count; ????????if?(n?==?anotherString.count)?{ ????????????char?v1[]?=?value; ????????????char?v2[]?=?anotherString.value; ????????????int?i?=?offset; ????????????int?j?=?anotherString.offset; ????????????while?(n--?!=?0)?{ ????????????????if?(v1[i++]?!=?v2[j++]) ????????????????????return?false; ????????????} ????????????return?true; ????????} ????} ????return?false; }
這下明白了么?String也是先比較地址,但是又都不僅僅比較地址!?。?br />
木刻雪原
游戲于此 提問者
String ?自己已經(jīng)重寫了 equals方法 ,你點(diǎn)進(jìn)去看就知道了?
應(yīng)該是存儲(chǔ)地址里面內(nèi)容的比較吧
舉報(bào)
課程升級(jí)!以終為始告別枯燥,在開發(fā)和重構(gòu)中體會(huì)Java面向?qū)ο缶幊痰膴W妙
3 回答java中的比較
1 回答不同類之間的對(duì)象能比較相等嗎?
12 回答怎么比較兩個(gè)不同子類的值是否相等?
5 回答交作業(yè),類分的比較細(xì),大家一起交流
1 回答重寫的equlals方法中類型比較的問題
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2016-07-12
首先,從你的問題就開始,你說類的比較是指存儲(chǔ)地址的比較,這句話是不對(duì)的。
因?yàn)?,在沒有重寫equals之前,你使用equals方法,確實(shí)是比較地址的,這是因?yàn)閑quals屬于object這個(gè)老祖宗(基類)內(nèi)的方法,初始化后的作用就是比較地址的,但是問題來了,除非你一個(gè)new出來的對(duì)象,否則肯定都為false,因?yàn)槟忝縩ew一個(gè),出來的都是開辟一個(gè)新的空間。而java所提供的類中,有的重寫了equals方法,所以最后如String,Integer,Date在這些類當(dāng)中equals有其自身的實(shí)現(xiàn),而不再是比較類在的存放地址了。
如果當(dāng)此類是你自定義的類,你可以根據(jù)需求去重寫equals方法。就是課堂里的重寫了一個(gè)多重比較的equals方法:先比較地址,如果一樣,就返回true;再比較空對(duì)象,為false;再比較類對(duì)象,不同為false;相同了就繼續(xù)比較屬性值,相同為true,不同為false。
其次,第二個(gè)問題,String的比較,這個(gè)看你的String是new出來的還是直接賦值來的:
首先是String c=“hello”方式,這種方式,優(yōu)先去“字符串緩沖池”中尋找這個(gè)“hello”字符串是否被創(chuàng)建了,如果有,就指向它;如果沒有則開辟空間創(chuàng)建;也就是相當(dāng)于String c=new String("hello");
下面java提供的String類中的equals方法:
這下明白了么?String也是先比較地址,但是又都不僅僅比較地址!?。?br />
2016-08-06
String ?自己已經(jīng)重寫了 equals方法 ,你點(diǎn)進(jìn)去看就知道了?
2016-07-04
應(yīng)該是存儲(chǔ)地址里面內(nèi)容的比較吧