equals与==的区别

马丿克 2019-08-11 01:23:02
1.第一种情况如果对比的是基础类型,那么就只用==比较值,不能用equals方法。 2.第二种情况如果对比的是引用类型,并且引用类型对象没重写equals方法,那么此时调用的方法就是Object中的equals方法,因为Object是所有类的父类。Object的源代码如下,可知此时的equals方法与==并没有区别,比较的都是对象的内存地址。 public boolean equals(Object obj) { return (this == obj); } 3.第三种情况如果对比的是引用类型,但是引用类型对象重写了equals方法,或者继承父类中有重写equals方法,则调用自己或者最近一级父类的equals方法。此时equals比较需看它是如何重写的,==还是比较对象的内存地址。 4.第四种情况在Java中String就重写了equals方法,重写后的equals方法比较的是值。此时equals比较的就是对象的值,==比较还是对象的内存地址。Java中常见的重写还有Integer、Byte、Float等。 5.String类型在常量式创建比较String类型有两种创建方法,以下比较结果可发现一个问题,在常量式创建时,内存地址的比较结果为true。常量式字符串,字符串是存在字符串常量区,再创建下一个对象时,就会去字符串常量区寻找有没相同的对象,有就直接引用,所以==比较内存地址时结果也为true,他们引用了字符串的同一个常量。对象式创建与其他引用类型对象一样,对象放堆中,地址放栈中,新的对象有新地址,所以==的结果为false。 //常量式创建比较 String t1 = "str"; String t2 = "str";Boolean b3 = t1.equals(t2); //结果为ture 比较值 Boolean b4 = t1==t2?true:false; //结果为true 比较内存地址 //对象创建式比较 String s1 = new String("str"); String s2 = new String("str"); Boolean b1 = s1.equals(s2); //结果为ture 比较值 Boolean b2 = s1==s2?true:false; //结果为false 比较内存地址 //混合式比较 Boolean b5 = t1.equals(s1); //结果为ture 比较值 Boolean b6 = t1==s1?true:false; //结果为false 比较内存地址 6.总结因为最初equals设计的目的就是用来比较对象值的,只是设计者无法确定具体类如何进行比较,所以默认比较内存地址。在开发过程中,很多时候就需要自己重写equals方法,达到自己比较的目的。
...全文
109 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧