Java中的equals() 和 ==
java中处处是对象。所有类都继承自Object基类,Object基类拥有一个equals()方法。所以无论是继承自Object,还是override了基类的,所有类都拥有equals()方法。
public boolean equals(Object obj) {
return (this == obj);
}
上面是Object类的equals()方法,很简单,使用了比较了两个对象。
而是java中的运算符,用在两个对象的引用之间时,作用是比较两个对象的地址。
所以那个类如果没有override这个方法,在其对象上使用equals()和==是等效的。
@Test
public void compareObject() {
StringBuffer strOne = new StringBuffer("String");
StringBuffer strTwo = new StringBuffer("String");
System.out.println(strOne==strTwo);
System.out.println(strOne.equals(strTwo));
Integer intOne = new Integer(999);
Integer intTwo = new Integer(999);
System.out.println(intOne==intTwo);
System.out.println(intOne.equals(intTwo));
}
false
false
false
true
StringBuffer也是一种字符串类,需要注意的是它没有override基类的equals方法。所以即使对象中的内容一样,equals()返回的也是false。
而Integer类实现了它自己的equals()方法,内容同样是999的两个对象被equals()正确判断为true。
下面是Integer类实现的equals()
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
如果我们自己写的类也需要进行比较,那么我们实现的equals()需要比较我们类对象中的内容,这样才符合java规范。
需要注意的是,如果一个类需要重写equals方法,那么同时也应该重写hashCode()方法。因为java文档规定了,如果A.equals(B)返回为true,那么A.hashCode()应当等于B.hashCode()。关于hashCode()还有另外一篇博文详细介绍。
如果忽略了equals以及hashCode方法,其他程序员或者其他工具类按照标准去使用你的定制类就会出现错误。