让你彻底理解 “==”与 Equals
相信很多朋友在面对,对象判等时经常会犹豫是用“==”还是Equals呢?有时候发现两者得到的结果相同,但有时候有不同,
究竟在什么情况下"==" 会相等,什么情况下Equals会不相等,看完本篇相信你心里自有结论。
一 基本概念
值相等:表示比较的两个对象的数据成员按内存位分别相等,即两个对象类型相同,并且具有相等和相同的字段
引用相等:表示两个引用指向相同对象实例,也就是同一内存地址,(由引用相等,可以推出其值相等,反之则不能)
二 不同类型"=="与Equals 判等结果
2.1 值类型
"=="运算符:表示值是否相等
"Equals":还是表示值是否相等 ,反编译后可以看到Equals 方法还是用了"=="运算符判等
public bool Equals(int obj)
{
return (this == obj);
}
所以对于值类型 不管是用 "=="运算符还是Equals方法得到的结果都是一样的(方法或运算符没有被重载)
2.2 引用类型
2.2.1 一般引用类型的 "=="运算符:表示引用地址是否相等,
两个对象虽然值相等,但是属于不同实例,所有引用地址也不一样
object a = new string(new char['a']);
object b = new string(new char['a']);
Console.WriteLine(a == b);//false
2.2.2一般引用类型的 Equals方法:表示值是否相等
object a = new string(new char['a']);
object b = new string(new char['a']);
Console.WriteLine(a.Equals(b));//true
2.2.3 特殊引用类型string: “==”运算符:表示值是否相等
string a = "";
string b = ""; Console.WriteLine(a==b);//true
对于为什么string 会比较值相等,相信大家都有疑问那请看下边的代码
注意:两个stirng对象在用"=="运算符判等时会调用 op_Equality()方法,这个方法里究竟做了什么操作呢,反编译一下string类 得到如下代码
我发现op_Equality()方法里居然重写了"=="运算符 且在其中调用了Equals方法,那string类的Equals方法又进行了哪些操作呢,请看图2
跟进Equals方法后发现居然是用"=="操作符判等了,瞬间我明白了大至如下:
因为string类以“==”操作符来处理值相等,
而重写“==”操作符的方法中又调用了Equals方法,
而Equals方法最终还是用"=="操作符判等,
我去~~带我们绕了个圈,最终发现string 类的 Equals方法与"=="操作符,得到结果是一样的
//特殊引用类型string
string a = "";
string b = ""; Console.WriteLine(a==b);//true
Console.WriteLine(a.Equals(b));//true
三 自定义引用类型 “==”与 Equal判等
3.1 "=="操作符:表示引用是否相等
因为两个实例处于托管堆中不同的块中所引用地址必然不同,返回false
class MyClass
{
public string str = ""; }
MyClass myClass = new MyClass();
MyClass newClass = new MyClass();
Console.WriteLine(myClass == newClass);//false
3.2 Equals() 方法:表示相个实例是否相等
注意:为什么会是false 明明两个对象是一样的啊???为什么??为什么??? 想知道原因?请接着看
class MyClass
{
public string str = ""; }
MyClass myClass = new MyClass();
MyClass newClass = new MyClass();
Console.WriteLine(myClass.Equals(newClass));//false
解释:所有类默认都继承了object类,Object类本身是带有几个方法 的,Equals就是其中之一,因为MyClass没有重载基类Object中的 Equals虚方法所以调用的是Object中的Equals方法 ,那Object中的Equals方法究竟又有什么操作呢?
反编译一下就知道鸟
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries"), __DynamicallyInvokable]
public virtual bool Equals(object obj)
{
return RuntimeHelpers.Equals(this, obj);
}
RuntimeHelpers.Equals()方法官方说明:此方法判断指定的 Object 实例是否被视为相等
很明显 代码中 myClass 与 newClass 属于不同实例,所以会返回false
若要返回True则需要重载Object中的Equals方法如下
class OverrideClass
{
public string Str = ""; //重载Object中Equals方法
public override bool Equals(object obj)
{
OverrideClass nclass = obj as OverrideClass;
//as 如果转换失败会返回null
if (nclass == null)
{
return false;
}
//对比对象属性是否相等
if (this.Str == nclass.Str)
{
return true;
}
else
{
return false;
}
} }
OverrideClass oClass = new OverrideClass();
OverrideClass nClass = new OverrideClass(); Console.WriteLine(oClass.Equals(nClass));//true
四 总结
到这里“==”与Equals就写完了总结如下:
值类型:“==”操作符与Equals方法本质上没有区别都将得到相同结果
引用类型:"=="操作符表示引用地址是否相等,Equals方法表示 值 是否相等
自定义引用类型:"=="操作符表示引用地址是否相等,Equals方法 根据重载的情况得到不同结果
特殊引用类型string:"=="与Equals 存在相互调用,得到结果都一样
以上纯属个人见解,如有误请一定指出,以免误导
希望本文能带给需要的朋友一点小小的收获,如果您觉得本文对您有那么一点点帮助还望小小的推荐一下啊,您的推荐将是我源源不断的写作力~
让你彻底理解 “==”与 Equals的更多相关文章
- Java基础系列-深入理解==和equals的区别(一)
一.前言 说到==和equals的问题,面试的时候可能经常被问题到,有时候如果你真的没有搞清楚里边的原因,被面试官一顿绕就懵了,所以今天我们也来彻底了解一下这个知识点. 二.==和equals的作用 ...
- 《面试经典系列》- 从底层理解==和equals的区别
前言 在我们Java面试中,基础知识基本上比定会考核的点,而“==和equals的区别”则是面试官最喜欢.最经常问的问题. 但我们看了不少的文章.解释,总是一头雾水.一知半解的,往往很容忘记.今天,我 ...
- 深入理解== 和 equals 的本质区别
简介 初学者常常被"= =“和‘equals ’所折磨,为什么,因为他们的大概意思相同,都是比较两个对象是否相等,而又不搞不清他们的具体比较两个对象相等的原理是什么,所以经常搞混淆,接下来我 ...
- java基础 字符串 “==” 和 “equals” 比较
demo: public class TestStringEquals { public static void main(String[] args) { String a = "test ...
- ==与equals()区别
equals和==的区别? 经常被简单的理解为equals方法用来比较两个对象是否相同, 而==比较运算符用来比较两个基本数据类型的数值是否相同. 这样的理解无可厚非,但还要透过简单看看本质,才会更清 ...
- Java 重写 equals 与 hashCode 的注意事项
为什么重写 equals 的时候必须重写 hashCode 大家可能从很多教程中了解到: SUN官方的文档中规定"如果重定义equals方法,就必须重定义hashCode方法,以便用户可以将 ...
- equals()方法详解
Java语言中equals()方法的使用可以说比较的频繁,但是如果轻视equals()方法,一些意想不到的错误就会产生.哈哈,说的有点严重了~ 先谈谈equals()方法的出身.equals()方法在 ...
- Java常见面试问题: equals()与hashCode()的使用
目录 1 equals()与'=='的区别 2 equals()方法的重写规则 3 为什么重写equals()的同时还需要重写hashCode() 4 JDK 7中对hashCode()方法的改进 5 ...
- 夯实Java基础(五)——==与equals()
1.前言 我们在学习Java的时候,看到==.equals()就认为比较简单,随便看了一眼就过了,其实你并没有深入去了解二者的区别.这个问题在面试的时候出现的频率比较高,而且据统计有85%的人理直气壮 ...
随机推荐
- java.lang.NoClassDefFoundError:TagSupport
这个错误应该就是没有成功加载tomcat自带的jar包jsp-api.jar. 在网上看到很多网友说要把tomcat/lib下的jsp-api.jar拷贝到项目/WEB_INF/lib下并导入,本人试 ...
- Linux[Fedora]查找文件包含的字段
find 与 grep组合查找 find . –name '文件类型' | xargs grep –n '查找内容'文件类型可正则表达式通配, [.]表示当前目录下进行查找,也可自由指定目录.比如: ...
- 《C陷阱与缺陷》之1词法"陷阱"
编译器中负责将程序分解为一个一个符号的部分,一般称为"词法分析器".在C语言中,符号之间的空白(包括空格符.制表符或换行符)将被忽略. 1.=不同于== C语言使用符号" ...
- 关于/etc/hosts文件
1,/etc/hosts,主机名何ip配置文件.hosts---The static table lookup for host name(主机名查询静态表) linux 的/etc/hosts是配置 ...
- linux下使用Apache+php实现留言板功能的网站
一.首先我们的linux服务器上要安装Apache和php 请参考:http://www.cnblogs.com/dagege/p/5949620.html 二.关闭防火墙服务,关闭selinux 请 ...
- ELK Nxlog->Kafka->ElasticSearch
Windows 系统下,log4日志通过kafka发送到elasticsearch; windows 下nxlog没有找到直接发送数据到kafka的插件,所以采用logstash中转下 Nxl ...
- jmeter 性能测试工具的使用(Web性能测试)
1.下载 http://pan.baidu.com/s/1o7p18Ye 该软件不用安装,直接解压打开即可使用. 2.使用 这里就在win下进行,图形界面较为方便 在目录apache-jmeter-2 ...
- PHPCMS如何开启手机站点
现在手机端用户增长急速增长,看天猫今年双十一,有47%交易是移动端交易的,所以手机功能已逐渐替代电脑的功能,使用手机上网已经成为了互联网新的趋势,很多客户以及站长都希望手机能够访问自己的网站,那么今天 ...
- [麦先生]TP3.2之微信开发那点事[基础篇](网页授权开发之小Demo)
用户à 点击按钮进入授权页面并确认授权à 服务器返回code给开发者à 利用code,APPID,APPsecret组合数据请求API获取access_token和openidà 利用access_t ...
- 【转】【收藏】LINQ学习心得分享--------(二)LINQ语法详解
原地址:http://blog.csdn.net/xuemoyao/article/details/8053444 通过上一章节的学习,相信大家已经掌握了学习LINQ的前期的准备知识.在这一节里, ...