《Effective JAVA學習筆記》之 equals()

import java.util.Arrays;

class Person {
	String name;
	int birthYear;
	byte[] raw;
	
	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof Person))
			return false;

		Person other = (Person) obj;
		return this.name.equals(other.name) && this.birthYear == other.birthYear && Arrays.equals(this.raw, other.raw);
	}
	
	@Override
	public int hashCode() {
		return name.hashCode()  + Arrays.hashCode(raw);
	}
}

如何理解:當你創造出了一個新類,你固然要制定某些規則。好比:新類new出來的兩個實例,怎麼樣才能算一摸同樣。這個相等規則就是equals()。 hashCode至關於這個類的身份ID,你能夠自定義。固然不一樣的實例,hashCode確定是不同的。html

  • 參數必須是Object類型,不能是外圍類。java

  • foo.equals(null) 必須返回false,不能拋NullPointerException。(注意,null instanceof 任意類 老是返回false,所以上面的代碼能夠運行。)api

  • 基本類型域(好比,int)的比較使用 == ,基本類型數組域的比較使用Arrays.equals()。數組

  • 覆蓋equals()時,記得要相應地覆蓋 hashCode(),與 equals() 保持一致。數據結構

  • 參考: java.lang.Object.equals(Object)oracle

  • 當x和y兩個對象具備x.equals(y) == true ,你必需要確保x.hashCode() == y.hashCode()。ide

  • 根據逆反命題,若是x.hashCode() != y.hashCode(),那麼x.equals(y) == false 一定成立。性能

  • 你不須要保證,當x.equals(y) == false時,x.hashCode() != y.hashCode()。可是,若是你能夠儘量地使它成立的話,這會提升哈希表的性能。this

  • hashCode()最簡單的合法實現就是簡單地return 0;雖然這個實現是正確的,可是這會致使HashMap這些數據結構運行得很慢。code

  • 參考:java.lang.Object.hashCode()


http://www.cnblogs.com/xudong-bupt/p/3960177.html

相關文章
相關標籤/搜索