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