C 中的 和 equals 有什麼區別?

2022-04-04 18:27:42 字數 2004 閱讀 9479

如以下**:12

3456

789intage =25;

short newage =25;

console.writeline(age == newage);//true

console.writeline(newage.equals(age));//false

console.readline();

int和short為原始型別,但與「==」比較返回true,equals()比較返回false。為什麼呢?

answers

簡而言之:

「equals()」相比「= =」複雜。

具體來說:

原始型別覆蓋(override)基類的object.equals(object),並且當括弧中的object與其型別和值相同時返回true (注意nullable型別也適合上述判斷;非空nullable型別總是裝箱到乙個基礎型別例項)。

由於newage是short,因此在object是short且值與newage值相等時,newage.equals(object)返回true。你傳遞的是乙個int物件,所以它返回false。

相比之下,「= =」運算子被定義為帶兩個整形(int)或兩個短整型(short)或兩個長整形(long)的運算。當「= =」兩個引數乙個是整形和乙個短整型時,編譯器會隱式轉換short為int,並比較轉換後int值大小。

使其工作其他方法:

原始型別也有自己的equals()方法,equals接受相同的型別的引數。

如果你寫age.equals(newage),編譯器將選擇int.equals(int)作為最好的過載(overload)方法且隱式轉換short為int。然後,它會返回true,因為這種方法直接比較兩個int值大小。

short也有乙個short.equals(short)方法,但是int型別不能隱式轉換為short,所以就不會呼叫它。

你可以使用cast轉換強制呼叫這個方法:

1console.writeline(newage.equals((short)age));//true

這將直接呼叫short.equals(short),沒有裝箱操作。如果age大於32767,它會丟擲乙個溢位異常。

你也可呼叫short.equals(object)這個過載,但需要明確地傳遞乙個經過裝箱的具有相同型別的物件:

1console.writeline(newage.equals((object)(short)age));// true

像前面可選方法(short.equals(short))一樣,如果大小超過short範圍,同樣丟擲乙個溢位異常。不同於以往的解決方案,它將short裝箱成乙個object——浪費time和memory。

這裡是實際中使用的equals():12

3456

78910

1112

1314

1516

1718

19publicoverridebool equals(objectobj)

returnm_value == ((int16)obj).m_value;

}

publicbool equals(int16 obj)

和equals有什麼區別

分為兩種情況 1.比較的型別是基本資料型別時,只比較他們的值是否相等。2.比較型別為引用型別時,比較的是引用變數的記憶體位址是否相同。equals 1.對於普通物件來說,equals 函式原始碼就是實現 所以就是比較引用是否相同。基本型別沒有equals方法 2.對於string來說,就是比較值是否...

c 中 與equals有什麼區別

對於值型別 引用型別來說比較過程怎樣的?using system using system.collections.generic using system.text set public person string name class program string b new string ne...

c 與equals有什麼區別

對於值型別 引用型別來說比較過程怎樣的?using system using system.collections.generic using system.text set public person string name class program string b new string ne...