C 中equals和 的區別

2021-06-05 14:31:43 字數 2724 閱讀 8799

對於值型別,如果物件的值相等,則相等運算子 (==) 返回 true,否則返回 false。對於string 以外的引用

== 返回 true。對於 string 型別,== 比較字串的值。

==操作比較的是兩個變數的值是否相等。

equals()方法比較的是兩個物件的內容是否一致.equals也就是比較引用型別是否是對同乙個物件的引用

對於值型別的比較,這裡就不做描述了,下面討論引用型別的比較:

首先我們看一段程式

using system;

using system.collections.generic;

using system.linq;

using system.text;

set

}public person(string name)}}

using system;

using system.collections.generic;

using system.linq;

using system.text;

);string b = new string(new char );

console.writeline(a == b);

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

object g = a;

object h = b;

console.writeline(g == h);

console.writeline(g.equals(h));

person p1 = new person("jia");

person p2 = new person("jia");

console.writeline(p1 == p2);

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

person p3 = new person("jia");

person p4 = p3;

console.writeline(p3 == p4);

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

console.readline();}}

}執行程式,會輸出什麼呢?

答案是 true,true,false,true,false,false,true,true。

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

儲存在堆中。

==操作比較的是兩個變數的值是否相等,對於引用型變數表示的是兩個變數在堆中儲存的位址是否相同

equals操作表示的兩個變數是否是對同乙個物件的引用,即堆中的內容是否相同。

而字串是乙個特殊的引用型型別,在c#語言中,過載了string 物件的很多方法方法(包括equals()方法

因此在上面的例子中,字串a和字串b的兩個比較是相等的。

對於object g 和object h 時記憶體中兩個不同的物件,所以在棧中的內容是不相同的,故不相等。而g.equals(h)

太)。如果將字串a和b作這樣的修改:

string a="aa";

string b="aa";

則,g和h的兩個比較都是相等的。這是因為系統並沒有給字串b分配記憶體,只是將"aa"指向了b。所以a

的情況下做了記憶體的優化)。

對於p1和p2,也是記憶體中兩個不同的物件,所以在棧中的位址肯定不相同,故p1==p2會返回false,而這裡的p1.equals(p2)將返回false為什麼呢?

((((

因為例項equals算是比較複雜的乙個比較方法。例項equals可以比較引用是否指向同乙個物件,同時可以按值來比較物件。如果要按值比較物件,我們就需要過載equals物件來實現我們的比較邏輯。

同時equals預設也支援比較值型別的相等。那麼我們該怎麼過載equals來讓物件具有值相等性的比較呢?

msdn給我們列出了一些準則

我們來看看重寫**

publicclassperson

set}

privatestring_firstname;

publicstringfirstname

set}

privatestring_lastname;

publicstringlastname

set}

publicperson()

publicperson(intpersonid, stringfirstname, stringlastname)

publicoverrideboolequals(objectobj)

else

}publicoverrideintgethashcode()

}person person1 = newperson(1,"edrick","liu");

person person2 = newperson(2, "meci", "luo");

person person3 = person2;

person person4 = newperson(1, "edrick", "liu");

console.writeline(person4.equals(person1));

console.writeline(person4.equals(person2));

我們可以看到結果,第乙個為true,第二個為false。)))

對於p3和p4,p4=p3,p3將對物件的引用賦給了p4,p3和p4是對同乙個物件的引用,所以兩個比較都返回true。

C 中 與Equals的區別

c equals與 的區別 對於值型別,如果物件的值相等,則相等運算子 返回 true,否則返回 false。對於string 以外的引用型別,如果兩個物件引用同乙個物件,則 返回 true。對於 string 型別,比較字串的值。操作比較的是兩個變數的值是否相等。equals 方法比較的是兩個物件...

C 中 與Equals的區別

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

Java 中equals 和 的區別

疑問 equals 和 是用來幹什麼的?1 比較8種基本資料型別的引用位址,是否一樣 2 比較引用物件的內容,即堆的記憶體位址,是否一樣 疑問 兩者區別?public boolean equals object o 如果不重寫equals 兩者是沒有區別的。分析下string中兩者的區別 strin...