3

这是一个 Java 和 C# 问题。我们都知道,Object Identity(==) 测试两个对象是否引用相同的位置,Obejct Equality(Equals 方法) 测试两个不同(不相同)的对象是否具有相同的值。但是如果是字符串对象 Object Identity 和对象平等是相同的。例如,if 语句中的两个布尔表达式以下返回 true

string a="123";
string b="123";
if(a==b)
if(a.Equals(b))

为什么会这样??这个设计决策背后的原因是什么?

4

4 回答 4

4

Java 和 C# 都使用一种称为string interning的内存节省技术。因为字符串在这些语言中是不可变的,所以它们可以汇集经常使用的字符串(包括硬编码的字符串文字,如您的示例中所示)并在内存中使用对该字符串的多个引用以节省空间。

于 2009-12-01T07:30:20.130 回答
3

据我所知,在.net 中==,字符串运算符被重载以使用Equals()而不是对象标识。有关详细信息,请参阅此说明:http: //www.dotnetperls.com/string-equals

如果您需要知道它是否真的是同一个对象,请使用:

Object.ReferenceEquals(string1, string2)
于 2011-07-21T11:21:35.987 回答
2

实际上,至少在 Java 中,存在字符串缓存机制。一个陷阱是两个相等的字符串有时会在应用恒等运算符时返回 true,但并不总是返回 true。以下代码打印错误:

String a="123";
String b="12";
b=b+"3";
System.out.println(a==b);
于 2009-12-01T07:34:41.400 回答
0

如果您真的想确定,a.equals(b) == true但是(a==b) == false对于两个字符串 a 和 b 的计算结果为 false,那么您可以使用完全被低估的 (^^) 字符串构造函数:

String a = new String("abc");
String b = new String("abc");
if (a.equals(b)) {
   doTheyAreEqual();
   if (a != b) {
     doButNotTheSame();
   }
}
于 2009-12-01T09:26:28.943 回答