3 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
您不能重載==
運(yùn)算符,但equals(Object)
如果您希望它與==
運(yùn)算符的行為不同,則可以覆蓋,即不比較引用但實(shí)際比較對(duì)象(例如,使用其全部或部分字段)。
此外,如果你覆蓋equals(Object)
,也看看hashCode()
。這兩個(gè)方法需要兼容(即根據(jù)equals(Object)
需要相同的兩個(gè)對(duì)象hashCode()
),否則會(huì)發(fā)生各種奇怪的錯(cuò)誤(例如,將對(duì)象添加到集合或映射時(shí))。

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
==
比較對(duì)象引用,并詢問(wèn)兩個(gè)引用是否相同。
equals()
比較對(duì)象內(nèi)容,并詢問(wèn)對(duì)象是否代表相同的概念。

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊
在基元的情況下,==操作員檢查兩個(gè)值是否相同。
如果它不是基元,則檢查它是否是指向?qū)ο蟮耐粚?shí)例的兩個(gè)指針(或引用)。
該equals()方法執(zhí)行自定義檢查Object,通過(guò)使用檢查引用==。但在其他課程中,有時(shí)會(huì)equals()被覆蓋(我不知道這是否是正確的過(guò)去分詞)。equals()必須檢查內(nèi)容。
所以,例如:
int i0 = 34;
int i1 = 34;
int i2 = 35;
// results
i0 == i1: true
i1 == i0: true
i2 == i0: false
但如果我們有非基元
String str0 = new String("Hello man!");
String str1 = new String("Hello man!");
String str2 = new String("!nam olleH");
String str2copy = str2;
// Results
str0 == str1: false // Pointer to two different object, so == will give false
str1 == str2: false // Idem
str2 == str2copy: true // So this are two pointers to the same object
str0.equals(str1): true // This are not the same objects, but they are equal
str1 == str1: true // Again: two times a pointer to the same object
那么,為什么要str0.equals(str1)回歸true?因?yàn)镾tring類(lèi)具有覆蓋equals()。并且在該方法中,它不會(huì)通過(guò)執(zhí)行來(lái)檢查它們是否相等return this == obj;但是在該方法中,存在完整的檢查。我不知道他們使用哪種方法來(lái)比較兩個(gè)字符串,但這里有兩種可能的方法:
從兩個(gè)字符串生成一個(gè)哈希碼并檢查它們是否相等(int == int)
如果字符相同,則逐字符檢查。
所以我希望現(xiàn)在很清楚。
添加回答
舉報(bào)