==与equals

因为最近换工作的原因所以在复习一些东西,虽然在开发时至两个比较经常使用,但是现在突然发现让我描述这俩货的基本原理的话我反应的也是比较模糊,因此又自己研究了下,顺便找了找资料,但是资料看过感觉别人总结的语言还是有点不明白,后来还是决定自己总结一下。

==:

    在基本类型使用的时候比较的是两个对象的是否相等,在对象引用的时候比较的是两个对象的引用是否指向同一个内存地址。【PS:如果你对内存地址、栈内存、堆内存不了解的话建议先去了解之后再回来浏览这篇博客】

例1(基本类型):

int i =10;
int x = 10;
System.out.println(i == x);

结果:


解释:

基本类型只比较值是否一致,他们的值都是10,所以返回true;

equals:

    object对象的方法,默认比较的也是2个对象是否指向同一个内存地址,可以自己覆盖重写方法内容用来比较值是否相等。

    object中equals:


    String中实现重写:


String重写的时候先比较两个对象是否指向同一个引用,若不是在判断被比较对象是否是String类型,类型一致在比较value的长度是否一样,最后比较相同位置的字符是否相等。

例2(String类型)

String str1 = new StringBuffer("123456").toString();//StringBuffer1
String str2 = new StringBuffer("123456").toString();//Stringbuffer2
String str3 = str1;
System.out.print("str1==str2:");
System.out.println(str1==str2);
System.out.println("str1.equals(str2):"+str1.equals(str2));
System.out.println("str1.equals(str3):"+str1.equals(str3));
System.out.print("str1==str3:");
System.out.println(str1==str3);

结果:

解释:

str1==str2:false

我们创建了2个StringBuffer对象,即在内存中开辟了2个对象空间,产生了2个内存地址,分别由str1和str2引用,在使用"=="的时候比较的是str1和str2是否指向同一个内存地址,但是因为他们俩指向的是两个内存地址所以返回的判断结果为false;

str1.equals(str2):true

根据文章上方【String:equals】的解释这两个对象比较的是内容是否一致,两者内容都是“123456”所以返回判断结果为true;

str1==str3:true

两者引用的都是StringBuffer1,所以内存地址一致返回结果为true;

str1.equals(str3):true

这两者引用同一个对象【StringBuffer1】,所以无论判断内存地址还是对象的值返回的结果多事true;

PS:【如果你理解了上面的内容相信你一定可以明白下面的结果】

str2==str3:false;

str2.equals(str3):true

例3(对象类型):

Persion p1 = new Persion();
Persion p2 = new Persion();
Persion p3 = p1;
System.out.print("p1==p2:");
System.out.println(p1==p2);
System.out.print("p1.equals(p2):");
System.out.println(p1.equals(p2));
System.out.print("p1.equals(p3):");
System.out.println(p1.equals(p3));
System.out.print("p1==p3:");
System.out.println(p1==p3);

结果:


解释:

我们在堆内存中创建了2个对象(new persion()),栈内存创建了2个对象(p1,p2)两个栈中的对象分别引用两个堆中的对象,所以他们俩的内存地址是不一样的【栈中的对象引用堆中的对象凭借的就是内存地址】。而在Persion类中我们没用重写equals方法所以此时的equals也是判断两个对象是否引用同一个内存地址,所以p1==p2和p1.equals(p2)都是false;由于p1和p3引用的是同一个堆对象所以他们俩的内存地址指向相同,所以p1==p3和p1.equals(p3)返回的判断为true;

附上一张图来给大家方便理解:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值