关于对象标识和对象相等以及String类异常的问题

发布于 2024-08-13 05:25:25 字数 295 浏览 10 评论 0原文

这是一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

叹梦 2024-08-20 05:25:25

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.

吹梦到西洲 2024-08-20 05:25:25

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

对于 if你需要知道它是否真的是同一个对象,请使用:

Object.ReferenceEquals(string1, string2)

As far as I know, in .net the == Operator for Strings is overloaded to use Equals() instead of object identity. See this explanation for details: http://www.dotnetperls.com/string-equals

For if you need to know if it's really the same object, use this:

Object.ReferenceEquals(string1, string2)
梦在夏天 2024-08-20 05:25:25

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

String a="123";
String b="12";
b=b+"3";
System.out.println(a==b);

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:

String a="123";
String b="12";
b=b+"3";
System.out.println(a==b);
流绪微梦 2024-08-20 05:25:25

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

String a = new String("abc");
String b = new String("abc");
if (a.equals(b)) {
   doTheyAreEqual();
   if (a != b) {
     doButNotTheSame();
   }
}

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:

String a = new String("abc");
String b = new String("abc");
if (a.equals(b)) {
   doTheyAreEqual();
   if (a != b) {
     doButNotTheSame();
   }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文