我們在創建類時,有時候需要使用equals(Object)方法來判斷兩個對象是否是相同,java中的Object提供的默認的equals(Object)方法比較的是兩個對象的引用是否相同,如果引用相同的話,那麼equals(Object)返回true。我們創建自己的類的時候,往往定義的相同,不一定精確到引用相同,如果某兩個實例的個別特殊的屬性或者所有屬性都相同,那麼我們也稱這兩個對象是相同的,這時候這兩個對象引用不一定相同,但是我們希望equals方法能夠返回true,那麼我們就需要重寫equals()方法。
根據Joshua Bloch的《effective java》中的item 8規定了重寫equals(Object)方法的遵循的規則, 而item 9則規定了重寫equals方法的同時要重寫Hashcode()方法,以及重寫hashcode()方法遵循的規則,這樣使得在使用Hashmap或者hashset的時候,針對相同的兩個對象返回相同的hashcode整數, 舉例子說明一下:
public class Dog
{
String name;
String says;
public void setName(String name)
{
this.name = name;
}
public void setSays(String says)
{
this.says = says;
}
public String getName()
{
return name;
}
public String getSays()
{
return says;
}
// 重寫equals方法
public boolean equals(Object obj)
{
if(null == obj)
{
return false;
}
else if (obj == this)
{
return true;
}
else if (null != obj && obj instanceof Dog)
{
Dog d = (Dog) obj;
if (this.name == d.name && this.says == d.says)
{
return true;
}
}
return false;
};
//重寫equals方法的同時,需要重寫Hashcode()方法,保證equals比較相等的兩個對象,他們的hashcode也是相同的。
public int hashCode()
{
int result = 17;
result = 31 * result + name.hashCode();
result = 31 * result + name.hashCode();
return result;
};
public static void main(String[] args)
{
Dog spot = new Dog();
spot.setName("spot");
spot.setSays("Ruff");
Dog scruffy = new Dog();
scruffy.setName("spot");
scruffy.setSays("Ruff");
Dog bear = new Dog();
bear.setName("bear");
bear.setSays("wangwang");
System.out.println("spot == scruffy: " + (spot == scruffy)); //spot == scruffy: false
System.out.println("spot.name == scruffy.spot: "
+ (spot.getName() == scruffy.getName())); //spot.name == scruffy.spot: true
System.out.println("spot.equals(scruffy): " + spot.equals(scruffy)); //spot.equals(scruffy): true
System.out.println(spot.hashCode()); //113205265
System.out.println(scruffy.hashCode()); //113205265
System.out.println("bear == scruffy: " + (bear == scruffy)); //bear == scruffy: false
System.out.println("bear.equals(scruffy): " + bear.equals(scruffy)); //bear.equals(scruffy): false
scruffy = bear;
System.out.println("bear == scruffy: " + (bear == scruffy)); //bear == scruffy: true
System.out.println("bear.equals(scruffy): " + bear.equals(scruffy)); //bear.equals(scruffy): true
}
}