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
http://www.cnblogs.com/xudong-bupt/p/3960177.html