“==”和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 = "123";
string b = "123"; 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 = "123";
string b = "123"; Console.WriteLine(a==b);//true
Console.WriteLine(a.Equals(b));//true

三 自定义引用类型 “==”与 Equal判等
3.1 "=="操作符:表示引用是否相等
因为两个实例处于托管堆中不同的块中所引用地址必然不同,返回false

class MyClass
{
public string str = "123"; }
MyClass myClass = new MyClass();
MyClass newClass = new MyClass();
Console.WriteLine(myClass == newClass);//false

3.2 Equals() 方法:表示相个实例是否相等
注意:为什么会是false 明明两个对象是一样的啊???为什么??为什么??? 想知道原因?请接着看

class MyClass
{
public string str = "123"; }
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 = "123"; //重载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区别
java中 == 和equals区别: java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...
- JAVA基础之——三大特征、接口和抽象类区别、重载和重写区别、==和equals区别、JAVA自动装箱和拆箱
1 java三大特征 1)封装:即class,把一类实体定义成类,该类有变量和方法. 2)继承:从已有的父类中派生出子类,子类实现父类的抽象方法. 3)多态:通过父类对象可以引用不同的子类,从而实现不 ...
- Java中的 "==" 和 "equals" 区别
分析 "==" 和 "equals" 区别的时候先了解一下Java的内存. Java内存 “==” 和 “equals” 区别” “==”: “==”比较的是 ...
- ==,=和equals()区别
equals和=,==的区别 一. ==和equals的区别 1. ==是运算符 2. equals是String对象的方法 一般有两种类型的比较 1. 基本数据类型的比较 2. 引用对象的比较 ...
- hashCode() 和equals() 区别和作用(转)
出处:https://www.jianshu.com/p/5a7f5f786b75 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 == 的区别是什么 ...
- ==和equals区别
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号( ...
- java中==和equals区别
主要是使用String时候的区别! 一.java当中的数据类型和“==”的含义 基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,bool ...
- == 与 equals区别(HashCode方法)
1:==分析 1.2:基本类型比较 判断基本类型的数值是不是相等 1.3:对象类型比较 判断两个引用是不是指向同一个对象,即内存地址是不是相等. 2:equals分析 来判断对象内容是不是相等,一般有 ...
- C#基础之==(双等于号)与equals()区别
C#中Equals和= =比较 这两种方式也是大家在日常编码工作当中用的比较多的判断方式.之前在使用的时候也没太关注两者在比较不同类型的时候存在哪些区别. 今天就和大家一起深入了解一下其中区别 一.值 ...
随机推荐
- 紫书 例题8-13 UVa 11093 (反证法)
这道题发现一个性质就解决了 如果以i为起点, 然后一直加油耗油, 到p这个地方要去p+1的时候没油了, 那么i, i+1, --一直到p, 如果以这些点 为起点, 肯定也走不完. 为什么呢? 用反证法 ...
- jQuery实现点击图标div循环放大缩小功能
很基础的一个功能,点击左下角的图标按钮,地图的整个div会变大,变大预览之后,再次点击图标按钮,地图的整个div会变小,恢复原样,两个图标在地图界面的放大和缩小时间不断的切换图标状态(箭头向里面,或者 ...
- ASP.NET-本地化、全球化
在<system.web>中加入一个全球化的标识,网站就可以自适应全球化了 也可以将出错信息全球化 上面的这种方式测试过对google浏览器好像没用,但是对IE内核的是可行的,可能goog ...
- Qt之字体文件(TTF)
简述 TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字体文件格式,随着windows的流行,已经变成最常用的一种字体文件表示方式. 在一些特殊的场合,系统字符集不 ...
- 转:iPhone libxml2 not found during build
在新建的一个项目中,出现编译错误,发现是缺少了libxml2.dylib,后面将这个资源包添加了,编译还是出现标题上所说的问题 #import <libxml/tree.h> //#imp ...
- MYSQL学习笔记三:日期和时间函数
MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...
- 可靠的Windows版Redis
副标题: 评论更精彩,教你怎么解决64位Windows版Redis狂占C盘的问题. MS Open Tech 技术团队近期花了非常多时间来測试最新构建的Windows版Redis(可在 MS Open ...
- Why functions - Not only for python
It may not be clear why it is worth the trouble to divide a program into functions. There are a lot ...
- 桌面出现removable storage devices文件夹无法删除解决办法
今天桌面突然出现 removable storage devices 文件夹,且没有删除选项. 解决办法:往电脑里插一下u盘文件夹就会自动消失了.
- java 类和对象1
编写一个Java应用程序,该程序中有3个类:Lader.Circle和主类A.具体要求如下:Lader类具有类型为double的上底.下底.高.面积属性,具有返回面积的功能,包括一个构造方法对上底.下 ...