关于对象标识和对象相等以及String类异常的问题
这是一个Java和C#的问题。 我们都知道,Object Identity(==) 测试两个对象是否引用相同的位置,Obejct Equality(Equals 方法) 测试两个不同(不相同)的对象是否具有相同的值。但是对于字符串对象 Object Identity 和对象平等是相同的。 例如,下面 if 语句中的两个布尔表达式返回 true
string a="123";
string b="123";
if(a==b)
if(a.Equals(b))
为什么会这样? 这个设计决策背后的合理性是什么?
This is a Java and C# question.
We all know that, Object Identity(==) tests whether two objects refer to the same location and Obejct Equality(Equals method) tests whether two different (non identical)objects have the same value .But In case of string object Object Identity and Object Equality are same.
For e.g Below two boolean expressions in if statements return true
string a="123";
string b="123";
if(a==b)
if(a.Equals(b))
Why is it so??
What is the rational behind this design decision?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
Java 和 C# 都使用一种名为字符串驻留的内存节省技术。由于字符串在这些语言中是不可变的,因此它们可以池化常用的字符串(包括硬编码的字符串文字,如您的示例中所示),并在内存中使用对该字符串的多个引用以节省空间。
Java and C# both use a memory-saving technique called string interning. Because strings are immutable in these languages, they can pool frequently-used strings (included hard-coded string literals, like in your example) and use multiple references to that one string in memory to save space.
据我所知,在 .net 中,字符串的
==
运算符被重载为使用Equals()
而不是对象标识。有关详细信息,请参阅此说明: http://www.dotnetperls.com/string-equals对于 if你需要知道它是否真的是同一个对象,请使用:
As far as I know, in .net the
==
Operator for Strings is overloaded to useEquals()
instead of object identity. See this explanation for details: http://www.dotnetperls.com/string-equalsFor if you need to know if it's really the same object, use this:
其实,至少在Java中,对于字符串是有缓存机制的。一个陷阱是,在应用恒等运算符时,两个相等的字符串有时会返回 true,但并不总是返回 true。下面的代码打印错误:
Actually, at least in Java, there is a caching mechanism on strings. A pitfall is that two strings that are equal will sometimes, but not always return true when applying the identity operator. the following code prints false:
如果您确实想确定,对于两个字符串 a 和
a.equals(b) == true
但(a==b) == false
计算结果为 false b、那么你可以使用完全被低估的(^^)String构造函数:If you really want to make sure, that
a.equals(b) == true
but(a==b) == false
evaluates to false for two String a and b, then you can use the completely undervalued (^^) String constructor: