“==”即相等性,相等性的比较有以下两点: 1) 对于原生数据类型来说,比较的是左右两边的值是否相等。 2) 对于引用类型来说,比较左右两边的引用是否指向同一个对象,或者说左右两边的引用地址是否相同。 equals()方法,该方法定义在Object类当中,因此Java中的每个类都具有该方法,对于Object类的equals()方法来说,它是判断调用equals()方法的引用与传进来的引用是否一致,即这两个引用是否指向的是同一个对象。对于Object类的equals()方法来说,它等价于==。 那么,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()方法,而不要使用==。 那么,我们来看看重写父类Object类equals()方法的普通类怎么实现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()方法,比较的是字符串内容。 |