equals 方法是 java.lang.Object 类的方法。
下面从两个方面来说明equals()和==的差别:
(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。
“==”比较两个变量本身的值,即两个对象在内存中的首地址。
“equals()”比较字符串中所包含的内容是否相同。
【例子】
String s1,s2,s3 = "abc", s4 ="abc" ; s1 = new String("abc"); s2 = new String("abc"); s1==s2; //false,两个变量的内存地址不一样,也就是说它们指向的对象不 一样 s1.equals(s2); // true,两个变量所包含的内容是abc,故相等。 s1 == s3; //false s1.equals(s3); //true s3 == s4; //true,字符串常量所生成的变量,存放于常量池中,故其中所存放的内存地址是相等的 s3.equals(s4); //true
【注意】
在字符串构建中有个特殊字符串类型StringBuffer,StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较“地址”的。所以会有如下情形出现:
StringBuffer s1 = new StringBuffer("a"); StringBuffer s2 = new StringBuffer("a"); s1.equals(s2) //false
(2)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
A obj1 = new A(); A obj2 = new A(); obj1==obj2; //false obj1.equals(obj2); //false A obj1 = new A(); obj2 = obj1; obj1==obj2; //true obj1.equals(obj2); //true
【总结】:
1. equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。
== 比较符是比较指向的对象是否相同的,也就是对象在对内存中的的首地址。
2. equals 方法是 java.lang.Object 类的方法,Object类中的equals方法是用来比较“地址”的,但是String类中重新定义了equals这个方法,而且比较的 是值,而不是地址。
3. 如果是基本类型(byte, short, int, long, float, double, char,boolean)比较,那么只能用==来比较,不能用equals();
4. 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是 比较内容的。
5. 注意一个基本的原则:在定义一个类的时候,如果涉及到对象的比较,应该重写equals()方法。
重写equals()方法的一般规则:
a、先用“==”判断是否相等(是否指向同一对象)。
b、判断equals()方法的参数是否为null,如果为null,则返回false;因为当前对象不可能为null,如果为null,则不能调用其equals()方法,否则抛java.lang.NullPointerException异常。
c、当参数不为null,则如果两个对象的运行时类(通过getClass()获取)不相等,返回false,否则继续判断。
d、判断类的成员是否对应相等。往下就随意发挥了。
【例子】判断被比较对象user的username 属性和待比较对象的username相等:
public class User { private String username; @Override public boolean equals(Object obj){ if(obj == null){ return false; }else { if(this.getClass() == obj.getClass()){ User u = (User) obj; if(this.getUsername().equals(u.getUsername())){ return true; }else{ return false; } }else{ return false; } } } }