1. 程式人生 > >C#基礎 - equals和==的區別

C#基礎 - equals和==的區別

1、對於值型別來說,==和equals都是比較棧中的變數的值是否相等。

int i = 10;

int j = 10;

i == j;  // true

i.equals(j);  //true

2、對於引用型別來說(排除string型別),==比較的是棧中的兩個變數的值是否相同,但因為棧中儲存的是變數指向的堆中物件的首地址,所以也可以說比較的是兩者是否指向堆中的同一個物件;equals比較的也是兩個變數是否指向同一個物件。

Object a = new Object("ddd");

Object b = new Object("ddd");

a == b;  //false

a.equals(b);  //false

a和b指向的並不是同一個物件,所以不會相等。

Object c = new Object("ddd");

Object d = c;

c == d;  //true

d.equals(d);  //true

把c的引用賦值給d,使得c和d都指向同一個物件,所以會相等。

3、對於string型別的引用變數來說,因為C#中string物件的很多方法包括equals方法都被過載了,所以使得string型別的==和equals用起來跟值型別差不多。但因為堆中有靜態儲存區和動態儲存區,以下情況還是要區分的。

第一種情況,如果只是單純的給string賦值,而不動態new出一個空間,跟值型別處理一樣,只比較堆中的值是否相等。如:

string a = "ddd";

string b = "ddd";

a == b;  //true

a.equals(b);  //true

string型別的比較只會比較他們的值

Object c = a;

Object d = b;

c == d;  // true

c.equals(d);  //true

a和b的值會被儲存在靜態儲存區,所以把a和b賦值給c和d,c和d指向的是同一塊靜態儲存區,所以都為true

第二種情況,string型別的2個變數在堆中new出兩個物件,如:

string a = new string("ddd");

string b = new string("ddd");

a == b; //true

a.equals(b); //true

string型別的比較只會比較他們的值

Object c = a;

Object d = b;

c == d;  //false

c.equals(d);  //true

把a和b賦值給c和d,就是把兩者的引用賦值給c和d兩個物件,所以c和d指向的是不同的物件,a == b是false的,那為什麼c.equals(b)會是true呢,因為此時的equals這個方法用的還是string的equals方法,所以只會去比較他堆中的值是否相等。