首先我们要有==操作符的比较概念:
1.对于对象引用类型比较的是对象的存储地址
2.对于基本数据类型,比较的是它们的值。
我们知道,所有的对象都有一个终极父类--Object类,Object类定义了适合用于任何Java对象的方法,其中就有equals方法,这个方法的实现很简单:return (this == obj);如果两个对象的引用相同,它们毫无疑问指向同一个对象。
对很多类来说,默认的equals方法已经够了,但在基于状态的相等性测试中,有必要覆盖equals方法。在这种情况下,当两个对象的内容相等时,认为它们是相等的。例如,String类就覆盖了equals方法,String类的equals方法检查两个字符串是否由相同的字符组成,我们看一下源码:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
过String源码我们知道,String的首先判断引用是否相等,不相等再通过每个字符的对比,判断两个字符串数据是否相等。
Java初学者应该在课本上看到过类似这样的代码:
String s1=new String(“abc”);
String s2=new String(“abc”);
System.out.println(s1==s2); //false
System.out.println(s1.equals(s2)); //true
是不是已经没有困惑了呢?
如果我们需要自己定义一个对象相等的比较规则,则需要覆盖equals方法,注意:无论何时覆盖equals方法,均必须同时提供一个兼容的hashCode方法。重写equals方法常规步骤:
1.比较两个对象的引用
2.被比较对象判空
3.类型检查
4.比较实例变量
最后,我要介绍Java7新增的Objects类的equals方法,Objects类是Object的工具类,有一些十分好用的方法,equals就是其中之一。
我们知道,当使用x.quals(y)时,我们要确保x不能为空,一般我们有两种方法:
1.常量写外面,变量写里面
2.判空
上面这两种方法可以避免空指针,但实际开发时总有疏忽的时候。所以推荐使用Objects.equals(x,y),此equlas方法的代码实现也很简单
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}