黑马程序员技术交流社区

标题: ==与equals方法的问题 [打印本页]

作者: 曾祥旭    时间: 2013-3-24 10:11
标题: ==与equals方法的问题
本帖最后由 曾祥旭 于 2013-3-24 18:10 编辑

之前一直以为是:
==比较的是对象的地址值是否相等
equals()比较的是对象的内容是否相等。但是今天看到一个小程序:
Person p1=new Person(20);
Person p2=new Person(20);
System.out.println(p1==p2);//false
System.out.println(p1.equals(p2));//false
此时,p1与p2用equals方法进行比较结果是:false
那为什么在字符串中比较返回结果是:true,如下面的程序:
     String a=new String("foo");
     String b=new String("foo");
     System.out.println(a==b);//false
     System.out.println(a.equals(b));//true
此时,a与b比较为什么结果是true呢?
张孝祥老师在就业面试中的解释:
   两条new语句创建了两个对象,然后用a,b这两个变量分别指向
了其中一个对象,这是两个不同的对象,它们的首地址是不同的,
即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,
而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
   按照张老师的解释,那么a与b利用equals方法比较的不就应该是内容吗?
这样的话,p1与p2用equals方法进行比较结果是:false,这又是为什么呢?
内容不是相同的吗?不应该为true吗?
作者: 胡志超    时间: 2013-3-24 10:29
String类重写了equals方法,这两个方法是根据对象的内容来比较和计算哈希值的。你写的Person类直接继承object,延用了object的equals(),具体是根据什么来比较两个对象的,你可以查查文档
作者: 朱盛文    时间: 2013-3-24 10:29
equals和 == 比较的都是地址值是否相等,但是在某些类中,equals被重写了,重写后具体比较什么就得看它重写的内容。
像你后面提到的String类中equals的比较,其实就是重写了equals方法。其源码如下:
  1.     public boolean equals(Object anObject) {
  2.         if (this == anObject) {
  3.             return true;
  4.         }
  5.         if (anObject instanceof String) {
  6.             String anotherString = (String)anObject;
  7.             int n = count;
  8.             if (n == anotherString.count) {
  9.                 char v1[] = value;
  10.                 char v2[] = anotherString.value;
  11.                 int i = offset;
  12.                 int j = anotherString.offset;
  13.                 while (n-- != 0) {
  14.                     if (v1[i++] != v2[j++])       //这里就是通过判断两个字符串的每个字符是否相同来确定内容是否一样的
  15.                         return false;
  16.                 }
  17.                 return true;
  18.             }
  19.         }
  20.         return false;
  21.     }
复制代码

作者: 黑马-王鹏    时间: 2013-3-24 12:20
Person p1=new Person(20);
Person p2=new Person(20);
System.out.println(p1==p2);//false
System.out.println(p1.equals(p2));//false
因为你定义的Person没有复写equals方法,只能继承Object类中的equals方法,而查文档可知boolean equals(Object o){
return this==o;}中==和equals是一致的,并且p1和p2是两个独立的对象,所以返回的都是false

String a=new String("foo");
     String b=new String("foo");
     System.out.println(a==b);//false
     System.out.println(a.equals(b));//true
对于String类的一个特殊之处,就是它复写了equals方法(查文档可知),不用自定义就可以比较两个对象中的内容是否相等,
由于是两个独立对象且内容相等,所以==返回false
equals返回ture
注:如果要比较Person类中两个对象的内容是否相等,必须自定义复写equals方法




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