[英]Question about Object Identity and Object Equality and String class exception
這是一個Java和C#問題。 我們都知道,對象標識(==)測試兩個對象是否引用相同的位置,並且Obejct Equality(Equals方法)測試兩個不同(不相同)的對象是否具有相同的值。但是在字符串對象的對象標識和對象平等是相同的。 例如,if語句中的兩個布爾表達式返回true
string a="123";
string b="123";
if(a==b)
if(a.Equals(b))
為什么會這樣? 這個設計決定背后的理性是什么?
Java和C#都使用稱為字符串實習的內存節省技術。 因為字符串在這些語言中是不可變的,所以它們可以匯集經常使用的字符串(包括硬編碼的字符串文字,如示例中所示),並在內存中使用對該字符串的多個引用來節省空間。
據我所知,在.net中,字符串的==
運算符被重載以使用Equals()
而不是對象標識。 有關詳細信息,請參閱此說明: http : //www.dotnetperls.com/string-equals
如果你需要知道它是否真的是同一個對象,請使用:
Object.ReferenceEquals(string1, string2)
實際上,至少在Java中,字符串上有一個緩存機制。 一個陷阱是兩個相等的字符串有時會,但在應用標識運算符時並不總是返回true。 以下代碼打印為false:
String a="123";
String b="12";
b=b+"3";
System.out.println(a==b);
如果你真的想確定, a.equals(b) == true
但是(a==b) == false
false對於兩個字符串a和b計算為false,那么你可以使用完全被低估的(^^)字符串構造函數:
String a = new String("abc");
String b = new String("abc");
if (a.equals(b)) {
doTheyAreEqual();
if (a != b) {
doButNotTheSame();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.