亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

關于equals 和==d的區別?

首先equals和==的區別是什么?

然后重載Object后,equals和==的意義會改變嗎?

正在回答

6 回答

解釋一下==號,他比較的是一個對象在內存中的地址值,
比如2個字符串對象

String?s1?=?new?String("str");
String?s2?=?new?String("str");


如果用==號比較,會返回false,因為創建了兩個對象,他們在內存中地址的位置是不一樣的。

equals的情況比較復雜,它是java.lang.Object類中的一個方法。因為java中所有的類都默認繼承于Object,所以所有的類都有這個方法。

在Object類源碼中是這樣寫的。

public?boolean?equals(Object?obj)?{
return?(this?==?obj);
}


他同樣使用==號進行內存地址的比較。但是許多java類中都重寫了這個方法,比如String。

public?boolean?equals(Object?anObject)?{
if?(this?==?anObject)?{
return?true;
}
if?(anObject?instanceof?String)?{
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里的方法,如果==號比較不相等,還會進行一下值的比較。
所以equals方法具體的作用要看當前的那個類是如何實現重寫父類中該方法的。如果沒有重寫該方法,那么他和==號等價。

1 回復 有任何疑惑可以回復我~
#1

慕數據3565510 提問者

String s1 = new String("str"); 是什么意思,我以為只有創建對象可以這么寫
2017-05-12 回復 有任何疑惑可以回復我~
#2

慕數據3565510 提問者

非常感謝!
2017-05-18 回復 有任何疑惑可以回復我~

equals是判斷你輸入的值是否相等,比如String s=new String("a"); String s1=new String("a"),返回的結果是true,因為他比較只是s的值是否等于s1的值,如果s1的值改為b,那么他們的返回結果就是false,而==是比較兩個對象指向的內存地址是否相等和值的大小是否相等,因為創建了兩個對象,他們的內存地址肯定是不想等。

1 回復 有任何疑惑可以回復我~

還有你說的obj的equals方法 ?,這個在String是重寫了,也就是不在比較引用了 ,只是比較值的內容是不是相等,比如

String a = new Strting("s");

Sting a2 = new String("s");

這個是相等的?

因為String 重寫了 obj

0 回復 有任何疑惑可以回復我~
#1

慕數據3565510 提問者

好麻煩,我在理解理解吧
2017-05-12 回復 有任何疑惑可以回復我~

還有 這樣寫 String a = new String("s") ?String a2 = new String("s"); 結果是不會相等的 ,為什么? 是因為new的關鍵字,是代表一個新的,意思是 當我出現的時候 ,我不需要查詢以前??臻g存在的對象,所以 當new的時候,是 不會相等的 ?上面解釋了的是?==

0 回復 有任何疑惑可以回復我~

上面的解釋 有誤區,都是新手貼源碼,是不是很裝, 你可以試試 String a= "s",String a2="s" ,這樣是相等的 為什么?是因為 第一次運行 String a ="s",開辟了 s這個對象在??臻g, 第二次創建a2的時候 會在??臻g先去查有沒有一樣的 ,然后它查到了a1的值,然后給把a1值的一個引用給然后給 a2, 此時 a和a2的引用都指向"s"這個對象

0 回復 有任何疑惑可以回復我~
#1

莫忘初衷愛

上面寫錯了 上面寫的a1是a
2017-05-12 回復 有任何疑惑可以回復我~
#2

莫忘初衷愛

又看到一個錯誤...把開辟了了s這個對象在??臻g換成堆空間, 棧是 存放a 和a2 這種引用的空間 s是存放在堆空間的
2017-05-12 回復 有任何疑惑可以回復我~
#3

慕數據3565510 提問者 回復 莫忘初衷愛

??臻g和堆空間我不知道,但我明白你的意思了在內存中建立了一個名為a的字符串“s”,再建立a2的時候因為有“s”了就直接指向了,不在另外開辟內存空間,那么a==a2是true?
2017-05-12 回復 有任何疑惑可以回復我~
#4

莫忘初衷愛 回復 慕數據3565510 提問者

對的,是的.
2017-05-13 回復 有任何疑惑可以回復我~
#5

慕數據3565510 提問者 回復 莫忘初衷愛

但是視頻里不是說==表示的是a和a2的內存地址是否相等么?
2017-05-13 回復 有任何疑惑可以回復我~
查看2條回復

沒聽懂。。。。orz

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
Java入門第二季 升級版
  • 參與學習       531142    人
  • 解答問題       6326    個

課程升級!以終為始告別枯燥,在開發和重構中體會Java面向對象編程的奧妙

進入課程

關于equals 和==d的區別?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號