3 回答

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

TA貢獻1805條經驗 獲得超10個贊
在基元的情況下,==操作員檢查兩個值是否相同。
如果它不是基元,則檢查它是否是指向對象的同一實例的兩個指針(或引用)。
該equals()方法執行自定義檢查Object,通過使用檢查引用==。但在其他課程中,有時會equals()被覆蓋(我不知道這是否是正確的過去分詞)。equals()必須檢查內容。
所以,例如:
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?因為String類具有覆蓋equals()。并且在該方法中,它不會通過執行來檢查它們是否相等return this == obj;但是在該方法中,存在完整的檢查。我不知道他們使用哪種方法來比較兩個字符串,但這里有兩種可能的方法:
從兩個字符串生成一個哈希碼并檢查它們是否相等(int == int)
如果字符相同,則逐字符檢查。
所以我希望現在很清楚。
添加回答
舉報