博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
== && equals 区别
阅读量:5097 次
发布时间:2019-06-13

本文共 1928 字,大约阅读时间需要 6 分钟。

简单来讲:

"==" : 比较两个变量栈中的数值是否相等,(对于引用类型来讲,栈中存储的是其引用地址)

"equals" : 是否引用的同一个对象,即堆中的内容是否相同。

值类型与引用类型

值类型包括:(C#的所有值类型均隐式派生自System.ValueType)

  • 结构类型:struct(直接派生于System.ValueType);
  • 枚举类型: enum(派生于System.Enum);
  • 13种简单类型:char byte sbyte short ushort int uint long ulong float decimal char bool

引用类型包括:

     数组,用户定义的类、接口、委托,object,字符串(.Net 框架程序设计(修订版)中有这样一段描述:String类型直接继承自Object,这使得它成为一个引用类型,但是重载了string 对象的很多方法方法(包括equals()方法),使string对象用起来就像是值类型一样)

下面有一个例子,很好的说明了他们之间的区别,重新整理了一下更易理解。

引自:

//第一对输出 ,字符串a和字符串b的两个比较是相等的。

string a = new string(new char[] { 'h','e','l','l','o' });
string b = new string(new char[] { 'h','e','l','l','o' });

textBox1.Text = "a == b: " + (a == b).ToString()+"\r\n";

textBox1.AppendText( "a.Equals(b): " + a.Equals(b).ToString()+"\r\n");

//a == b: True

//a.Equals(b): True

//第二对输出 object g = a 和object h = b , 在内存中两个不同的对象,所以在栈中的内容是不相同的,故不相等。而g.equals(h)用的是sting的equals()方法故相等(多太)。

object g = a;
object h = b;
textBox1.AppendText( "g == h: " + (g == h).ToString()+"\r\n");
textBox1.AppendText( "g.Equals(h): " + g.Equals(h).ToString()+"\r\n");
//g == h: False
//g.Equals(h): True

//如果将字符串a和b作这样的修改:

// string a="aa";
//string b="aa";
//则,g和h的两个比较都是相等的。这是因为系统并没有给字符串b分配内存,只是将"aa"指向了b。所以a和b指向的是同一个字符串(字符串在这种赋值的情况下做了内存的优化)。

 

//对于p1和p2,也是内存中两个不同的对象,所以在内存中的地址肯定不相同,故p1==p2会返回false,又因为p1和p2又是对不同对象的引用,所以p1.equals(p2)将返回false。

Person p1 = new Person("jia");

Person p2 = new Person("jia");
textBox1.AppendText( "p1 == p2: " + (p1 == p2).ToString()+"\r\n");
textBox1.AppendText("p1.Equals(p2): " + p1.Equals(p2).ToString() + "\r\n");
//p1 == p2: False
//p1.Equals(p2): False

//对于p3和p4,p4=p3,p3将对对象的引用赋给了p4,p3和p4是对同一个对象的引用,所以两个比较都返回true

Person p3 = new Person("jia");
Person p4 = p3;
textBox1.AppendText("p3 == p4: " + (p3 == p4).ToString()+"\r\n");
textBox1.AppendText( "p3.Equals(p4): " + p3.Equals(p4).ToString()+"\r\n");

//p3 == p4: True

//p3.Equals(p4): True

如有问题或建议,欢迎留言 ~ 博客地址:

 

 

 

 

转载于:https://www.cnblogs.com/zqiang/p/3099288.html

你可能感兴趣的文章
从零开始系列之vue全家桶(1)安装前期准备nodejs+cnpm+webpack+vue-cli+vue-router
查看>>
Jsp抓取页面内容
查看>>
大三上学期软件工程作业之点餐系统(网页版)的一些心得
查看>>
可选参数的函数还可以这样设计!
查看>>
[你必须知道的.NET]第二十一回:认识全面的null
查看>>
Java语言概述
查看>>
关于BOM知识的整理
查看>>
使用word发布博客
查看>>
面向对象的小demo
查看>>
微服务之初了解(一)
查看>>
GDOI DAY1游记
查看>>
收集WebDriver的执行命令和参数信息
查看>>
数据结构与算法(三)-线性表之静态链表
查看>>
mac下的mysql报错:ERROR 1045(28000)和ERROR 2002 (HY000)的解决办法
查看>>
Hmailserver搭建邮件服务器
查看>>
django之多表查询-2
查看>>
快速幂
查看>>
改善C#公共程序类库质量的10种方法
查看>>
AIO 开始不定时的抛异常: java.io.IOException: 指定的网络名不再可用
查看>>
MyBaits动态sql语句
查看>>