为了账号安全,请及时绑定邮箱和手机立即绑定

关于Object中的equals方法和String中的equals方法的疑惑?

关于Object中的equals方法和String中的equals方法的疑惑?

慕婉清6462132 2019-04-21 20:37:52
首先是这段代码:publicclasstest{publicstaticvoidmain(String[]args){Strings1="Monday";Strings2=newString("Monday");if(s1==s2){System.out.println("s1==s2");}else{System.out.println("s1!=s2");}if(s1.equals(s2)){System.out.println("s1equalss2");}else{System.out.println("s1notequalss2");}}}输出结果是:s1!=s2和s1equalss2;这个我可以理解,使用new操作符后,在堆内存中又新开辟了一块空间,s1和s2在堆内存中的值相同,但是引用的地址不同。但是在博客园的这篇文章看到下面这段代码:publicclasstest{publicstaticvoidmain(String[]args){testobj1=newtest();testobj2=newtest();if(obj1==obj2){System.out.println("obj1==obj2");}else{System.out.println("obj1!=obj2");}if(obj1.equals(obj2)){System.out.println("obj1equalsobj2");}else{System.out.println("obj1notequalsobj2");}}}输出:obj1!=obj2obj1notequalsobj2昨天晚上看了那篇文章的评论,把我自己的理解写出来,但是还是不是很清楚,我大意是这样的:java当中所有类都继承自Object这个基类,在Object中的定义了一个equals方法,这个方法的初始化行为是比较对象的内存地址值(Object的equals方法使用==比较的),但在一些类库中这个方法被覆盖掉了,比如String,Interger,Date这些类中equals有其自己的实现方法,String类继承自Object类,也继承了equals方法,但是重写了该方法,不再比较类在堆内存中的存放地址了,而是比较存在堆中的值。???这个解释不知道对不对,望指教,还有,关于obj1notequalsobj2你们是怎么看的??
查看完整描述

2 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

==比较就不用说了,任何情况下都是比较内存地址。equals比较,是一个方法调用,默认的实现(Object类)是使用了==:
publicbooleanequals(Objectobj){
return(this==obj);
}
第一段代码:
比较的是String对象,而String类覆写了equals()方法,比较的是字符串内容,所以输出了s1equalss2。
这个你理解的没有问题!
第二段代码:
比较的是test对象,test类没有覆写equals()方法,所以还是默认比较内存地址,从而输出了obj1notequalsobj2。
                            
查看完整回答
反对 回复 2019-04-21
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

在下以为应该先抛开代码实现,直接看equals方法存在的意义———对比对象与对象是否相同。
那么问题来了,对象与对象怎样才算相同呢?这个就该由对象所属的类的作者来决定了,也只有他才能决定其创造的类的实例应该如何对比相同。
String的作者是谁不知道,但你也赞同他的equals实现吧?字符串对比字符串,就该对比字符序列是否相同。
至于test,它的作者是题主你,而你没有定义该如何对比test对象,但却调用了equals想要对比它。此时会有个什么结果?只能是test这个类的父类的equals结果呗,默认的父类是Object类,@ch_gilbert已经说明了~
                            
查看完整回答
反对 回复 2019-04-21
  • 2 回答
  • 0 关注
  • 290 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信