黑马程序员技术交流社区

标题: 纠结于equals [打印本页]

作者: DOOR    时间: 2013-12-28 14:47
标题: 纠结于equals
本帖最后由 DOOR 于 2014-1-16 00:36 编辑
  1. class Person
  2. {
  3.          String name;
  4.         public Person(String name)
  5.         {
  6.                 this.name = name;
  7.                
  8.         }
  9. }
  10. class Hello
  11. {
  12.         public static void main(String[] args)
  13.         {
  14.                 Person p1 = new Person("lisi");
  15.                 Person p2 = new Person("lisi");
  16.                 System.out.println(p1.equals(p2));
  17.                 String s1 = new String("zhangsan");
  18.                 String s2 = new String("zhangsan");
  19.                 System.out.println(s1.equals(s2));        
  20.         }
  21. }
复制代码
//打印结果一真一假,什么原因?
//equals不是比较对象内容的吗?
//p1和p2内容不一样?


作者: 松毛    时间: 2013-12-28 15:16
p1.equals(p2)利用的是Object中的equals比较方法,该方法比较的是两个对象是否相同。显然,p1和p2都new了一个Person,是两个不同的对象所以该语句为false。
而s1.equals(s2)使用的是String类中的equals方法,该方法是复写了Object中的equals方法,使其比较方式为比较这两个字符串中的内容是否相同,相同则返回true,不同则返回false。很显然,s1和s2中的内容是相同的都为“zhangsan”。所以该语句为true。
作者: DOOR    时间: 2013-12-28 15:37
松毛 发表于 2013-12-28 15:16
p1.equals(p2)利用的是Object中的equals比较方法,该方法比较的是两个对象是否相同。显然,p1和p2都new了一 ...

==和equals在没有复写过父类Object的子类里,功能一样?可以这样理解吧?
作者: 郭振华    时间: 2013-12-28 16:04
不能,== 只是比较字面值,在没有覆写object方法的情况掐,默认调用object类的equals方法,仍然和==不同,个人见解。
作者: DOOR    时间: 2013-12-28 16:31
郭振华 发表于 2013-12-28 16:04
不能,== 只是比较字面值,在没有覆写object方法的情况掐,默认调用object类的equals方法,仍然和==不同, ...

==比较的是地址值
equals比较的是否为同一对象
地址值不就决定了两个对象是否是同一个吗?

作者: 松毛    时间: 2013-12-28 16:33
DOOR 发表于 2013-12-28 15:37
==和equals在没有复写过父类Object的子类里,功能一样?可以这样理解吧?

这个地方的p1 == p2与p1.equals(p2)效果都是相同的,都比较的是p1和p2的地址值吧。
作者: 郭振华    时间: 2013-12-28 16:49
DOOR 发表于 2013-12-28 16:31
==比较的是地址值
equals比较的是否为同一对象
地址值不就决定了两个对象是否是同一个吗?

恩,对的,我查了下,我理解错了,很长时间没看基础了。是这样,== equals 在这里的功能确实一样。但是你是构造的对象,用new的,这玩意,都是从堆中强制创建的,内存地址不可能一样。抱歉,耽误你时间了。
作者: DOOR    时间: 2013-12-28 17:15
松毛 发表于 2013-12-28 16:33
这个地方的p1 == p2与p1.equals(p2)效果都是相同的,都比较的是p1和p2的地址值吧。 ...

3Q通透了
作者: 75100313    时间: 2013-12-28 17:53
一句话  Person类里面的equals()方法没有被重写,而String里面的已经被重写了  所以结果会不一样
作者: DOOR    时间: 2013-12-28 17:54
郭振华 发表于 2013-12-28 16:49
恩,对的,我查了下,我理解错了,很长时间没看基础了。是这样,== equals 在这里的功能确实一样。但是你 ...

感谢你的回复




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2