黑马程序员技术交流社区

标题: 帮助新手了解java中==和equals误区详解 [打印本页]

作者: 梁胜海    时间: 2012-11-2 18:24
标题: 帮助新手了解java中==和equals误区详解
==”即相等性,相等性的比较有以下两点:
1)  对于原生数据类型来说,比较的是左右两边的值是否相等。
2)  对于引用类型来说,比较左右两边的引用是否指向同一个对象,或者说左右两边的引用地址是否相同。
equals()方法,该方法定义在Object类当中,因此Java中的每个类都具有该方法,对于Object类的equals()方法来说,它是判断调用equals()方法的引用与传进来的引用是否一致,即这两个引用是否指向的是同一个对象。对于Objectequals()方法来说,它等价于==
那么,equals()方法既然对Object类等价于==,那么对于字符串是不是也一样适用呢?看看以下代码:public class StringTest2 {
   public static void main(String[] args) {
      Stringstr=newString("aaa");
      Stringstr2=newString("aaa");
      System.out.println(str.equals(str2));//判断是false还是true
      
      System.out.println("----------");
      Stringstr3="bbb";
      Stringstr4=newString("bbb");
      System.out.println(str3.equals(str4));//判断是false还是true
   }
}
以上结果分别是true,true。大家会奇怪,为什么会出现这样的结果,String不是继承了Object吗,特性怎么变得不一样?真正的原因其实是String类重写了父类Object类的equals()方法,通过看java源码可以得知。
那么我们进行总结:对于String类的equals()方法来说,它是判断当前字符串与传进来的字符串的内容是否一致。所以以后大家注意,对于String对象的相等性判断来说,请使用equals()方法,而不要使用==。
那么,我们来看看重写父类Objectequals()方法的普通类怎么实现String类中equals()方法。看如下代码:
       public class EqualsTest {
   public static void main(String[] args) {
      Student1stu1 = newStudent1("张三");
      Student1stu2 = newStudent1("张三");
      System.out.println(stu1==stu2);
      System.out.println(stu1.equals(stu2));//打印true
   }
}
class Student1 {
   Stringname;
   public Student1(String name) {
      this.name = name;
   }
   @Override
   public boolean equals(Object obj) {
       if(this==obj){   //判断两个引用是否指向同一个对象
         return true;
       }
       if(obj instanceof Student1){   //判断形参obj是否是Student类的实例
         Student1 stu =(Student1)obj;//强制转换成Student类
         //Student1stu2=new Student1();
        if(this.name==stu.name){   //判断两个类的属性是否相等
           return true;
        }
       }
       return false;
   }
}
总之一句话,对于继承了Object类的类来说,==和equals()使用方法是等价的,而对于String类,其实是String类重写了Object类的equals()方法,比较的是字符串内容。

作者: 李建强    时间: 2012-11-2 18:27
不错,谁都是这么走过来的
作者: 梁胜海    时间: 2012-11-2 19:09
希望管理员给推荐啊




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