簡體   English   中英

關於對象標識和對象平等以及String類異常的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM