重寫對象的equals(Object)方法,同時重寫Hashcode()方法

        我們在創建類時,有時候需要使用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

	}
}


              





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章