C 中 與Equals方法比較

2022-04-03 21:30:35 字數 2464 閱讀 8389

先來段**,如下:

static

void main(string

args)

);string b = new

string(new

char );

console.writeline(a == b); //

true

console.writeline(a.equals(b)); //

true

object obja = (object

)a;

object objb = (object

)b; console.writeline(obja == objb); //

false

console.writeline(obja.equals(objb)); //

true

person p1 = new person("

user");

person p2 = new person("

user");

console.writeline(p1 == p2); //

false

console.writeline(p1.equals(p2)); //

false

person p3 = new person("

user");

person p4 =p3;

console.writeline(p3 == p4); //

true

console.writeline(p3.equals(p4)); //

true

console.read();

}

答案是truetruefalsetruefalsefalsetruetrue為什麼會出現這個答案呢?因為值型別是儲存在記憶體中的堆疊(以後簡稱棧),而引用型別的變數在棧中僅僅是儲存引用型別變數的位址,而其本身則儲存在堆中。

總結如下:

1. 對於值型別,==和equals()等價,都是比較儲存資訊的內容(即比較兩個物件的值是否相同);

2. 對於除string之外的引用型別,==比較的是棧的內容是否相同(即是否指向同乙個堆中位址),equals()判斷是否對同乙個物件的引用(即堆中的內容是否相同);

3. string是一種特殊的引用型別,在c#語言中,過載了object物件的很多方法(包括equals()方法),使string物件用起來就像是值型別一樣

下圖為string類中過載的equals方法描述:

4. 對於一些自定義類,我們看看是否有過載equals方法,如果沒有則預設為基類的equals方法(如果基類沒有過載equals方法則為object類equals方法),object類中equals方法比較也是棧中的位址,而不是堆中的內容。

下圖為object類中equals方法描述:

因此我們不難理解下面的結果:    

person p1 = new person("user");

person p2 = new person("user");

console.writeline(p1 == p2);    //false

console.writeline(p1.equals(p2));  //false

5. 對於string型別有必要強調一下   

string a = "hello";

string b = "hello";

object obja = (object)a;

object objb = (object)b;

console.writeline(obja == objb);   //true

console.writeline(obja.equals(objb));  //true

結果:true,true

這是因為系統並沒有給字串b分配記憶體,只是將"hello"指向了b。所以a和b指向的是同乙個字串(字串在這種賦值的情況下做了記憶體的優化)。

參考:

java中equals 與 比較

1.對於 如果作用於基本資料型別的變數,則直接比較其儲存的 值 是否相等 如果作用於引用型別的變數,則比較的是所指向的物件的位址 2.對於equals方法 注意 equals方法不能作用於基本資料型別的變數 如果沒有對equals方法進行重寫,則比較的是引用型別的變數所指向的物件的位址 諸如stri...

equals比較與等值比較

equals equals比較是兩個物件之間的比較,如果呼叫equals這個方法的物件為null,則會報空指標異常。equals比較的邏輯是 先判斷兩個物件的型別是否相等,在判斷兩個型別的屬性值是否相等,若都滿足,則這兩個物件是相對。等值 等值比較如是基本資料型別和引用型別之間的比較,則直接編譯不通...

C 中 與Equals方法的區別

usingsystem using system.collections.generic using system.linq using system.text set public person string name class program string b new string new c...