C#基础 - equals和==的区别

1、对于值类型来说,==和equals都是比较栈中的变量的值是否相等。

int i = 10;

int j = 10;

i == j;  // true

i.equals(j);  //true

2、对于引用类型来说(排除string类型),==比较的是栈中的两个变量的值是否相同,但因为栈中保存的是变量指向的堆中对象的首地址,所以也可以说比较的是两者是否指向堆中的同一个对象;equals比较的也是两个变量是否指向同一个对象。

Object a = new Object("ddd");

Object b = new Object("ddd");

a == b;  //false

a.equals(b);  //false

a和b指向的并不是同一个对象,所以不会相等。

Object c = new Object("ddd");

Object d = c;

c == d;  //true

d.equals(d);  //true

把c的引用赋值给d,使得c和d都指向同一个对象,所以会相等。

3、对于string类型的引用变量来说,因为C#中string对象的很多方法包括equals方法都被重载了,所以使得string类型的==和equals用起来跟值类型差不多。但因为堆中有静态存储区和动态存储区,以下情况还是要区分的。

第一种情况,如果只是单纯的给string赋值,而不动态new出一个空间,跟值类型处理一样,只比较堆中的值是否相等。如:

string a = "ddd";

string b = "ddd";

a == b;  //true

a.equals(b);  //true

string类型的比较只会比较他们的值

Object c = a;

Object d = b;

c == d;  // true

c.equals(d);  //true

a和b的值会被保存在静态存储区,所以把a和b赋值给c和d,c和d指向的是同一块静态存储区,所以都为true

第二种情况,string类型的2个变量在堆中new出两个对象,如:

string a = new string("ddd");

string b = new string("ddd");

a == b; //true

a.equals(b); //true

string类型的比较只会比较他们的值

Object c = a;

Object d = b;

c == d;  //false

c.equals(d);  //true

把a和b赋值给c和d,就是把两者的引用赋值给c和d两个对象,所以c和d指向的是不同的对象,a == b是false的,那为什么c.equals(b)会是true呢,因为此时的equals这个方法用的还是string的equals方法,所以只会去比较他堆中的值是否相等。

转载于:https://www.cnblogs.com/zfylzl/p/9895361.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值