这是一个Java和C#的问题。我们都知道,Object Identity(==)测试两个对象是否引用相同的位置,Obejct Equality(Equals方法)测试在字符串对象标识和对象相等的情况下,两个不同(不相同)的对象是否具有相同的值.But。例如,if语句中的以下两个布尔表达式返回true
string a="123";
string b="123";
if(a==b)
if(a.Equals(b))为什么会这样呢?这个设计决策背后的理性是什么?
发布于 2009-12-01 15:30:20
Java和C#都使用一种称为string interning的节省内存的技术。因为字符串在这些语言中是不可变的,所以它们可以将频繁使用的字符串(包括硬编码的字符串文字,如您的示例)汇集在一起,并在内存中使用对该字符串的多个引用,以节省空间。
发布于 2011-07-21 19:21:36
据我所知,在.net中,字符串的==操作符被重载以使用Equals()而不是对象标识。有关详细信息,请参阅以下说明:http://www.dotnetperls.com/string-equals
因为如果您需要知道它是否真的是同一个对象,请使用以下命令:
Object.ReferenceEquals(string1, string2)发布于 2009-12-01 15:34:41
实际上,至少在Java中,字符串有一种缓存机制。一个缺陷是,在应用标识运算符时,两个相等的字符串有时会返回true,但并不总是返回true。下面的代码输出false:
String a="123";
String b="12";
b=b+"3";
System.out.println(a==b);https://stackoverflow.com/questions/1824540
复制相似问题