A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© liuyj 中级黑马   /  2012-9-25 20:30  /  2594 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

运算符==跟String类方法Equals()的区别?

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

7 个回复

倒序浏览
没有重写的时候,两个是一样的效果。但equals重写了后,就有区别了。
回复 使用道具 举报
通俗点讲就是==比较的永远是值是否相等,不分引用类型还是值类型
而Equals()方法对于值类型比较的是值是否相等而对于引用类型比较的是引用是否相等

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
==比较的是引用,Equals()比较的是值
string a = new string(new char[] { 'a', 'b', 'c' });
            string b = new string(new char[] { 'a', 'b', 'c' });
            object f = a;
            object h = b;
            bool z = (f == h);
            bool e = f.Equals(h);
            Console.WriteLine("f的值是{0},h的值是{1};\n用==比较结果:{2},用Equals比较结果:{3}", f, h,z,e);
            Console.Read();

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
==和equals的区别,在字符串比较的情况下,前者是比较两个字符串变量所指向的内存地址是否相同,而后者是比较两个字符串变量的值是否相同 只有在整型比较的时候,==和equals才是相等的。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
在.NET中,ReferenceEquals()方法是专门用来表示引用相等的;

==运算符和Equals()方法都可以用来表示引用相等和值相等。对于值类型而言, ==和Equals()方法是一样的,使用上没有什么区别。那么重点是引用类型:

从效果上说,对于引用类型, ==运算符表示引用相等(string有运算符重载,除外),而Equals()表示值相等。从效果上讲,这个说法好像不算错,网上也有这么一种说法。



从原理上说,无论是对值类型还是对于引用类型,==运算符和Equals()方法是相同的,当然排除了一个是运算符一个是方法的这个区别。为什么这样说呢?对于值类型而言,==运算符表示值相等,而Equals()方法在绝大多数的值类型中都重写了这个方法,使之能够支持值类型。在值类型这个层面的区别基本可以忽略。而对于引用类型而言, ==运算符表示引用相等(string除外),Equals()默认只支持引用类型(见第二个代码块),也表示引用相等。因此有==运算符既支持引用相等,也支持值相等,同样Equals()方法也支持值相等和引用相等, 所以==运算符和Equals()方法是相同的。那么为什么第三个代码块中的==运算符和Equals()方法的结果屡有不同呢?答案是多肽:子类实例指向父类引用,同种语义不同行为。虽然object为引用类型,而引用类型的Equals()方法的结果应该是引用相等,但由于多肽的存在,object类型的变量中实际存放的是值类型,所以调用的Equals()方法是子类实例的,因此才体现不相等的结果。也正因为如此,值相等还是引用相等和多肽这两个不相干的问题,硬是被说成了==运算符是引用相等而Equals()方法是值相等。



个人认为:==运算符和Equals()方法除了运算符和方法的区别外,再没有别的区别。而所谓的Equals()方法表示值相等的说法只是由于多肽而造成的假象。当然,Equals()用于值相等的说法效果上好像也说得过去。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
==若用于比较字母中不能区分大小写,而Equa()就可以区分,且一个是运算符,一个是方法l

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马