首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于对象标识、对象相等和字符串类异常的问题

关于对象标识、对象相等和字符串类异常的问题
EN

Stack Overflow用户
提问于 2009-12-01 15:26:14
回答 4查看 2.1K关注 0票数 3

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

代码语言:javascript
复制
string a="123";
string b="123";
if(a==b)
if(a.Equals(b))

为什么会这样呢?这个设计决策背后的理性是什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-01 15:30:20

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

票数 4
EN

Stack Overflow用户

发布于 2011-07-21 19:21:36

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

因为如果您需要知道它是否真的是同一个对象,请使用以下命令:

代码语言:javascript
复制
Object.ReferenceEquals(string1, string2)
票数 3
EN

Stack Overflow用户

发布于 2009-12-01 15:34:41

实际上,至少在Java中,字符串有一种缓存机制。一个缺陷是,在应用标识运算符时,两个相等的字符串有时会返回true,但并不总是返回true。下面的代码输出false:

代码语言:javascript
复制
String a="123";
String b="12";
b=b+"3";
System.out.println(a==b);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1824540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档