java HashMap用自定義類作為key
阿新 • • 發佈:2019-01-06
用自定義類作為key,必須重寫equals()和hashCode()方法。
自定義類中的equals() 和 hashCode()都繼承自Object類。
Object類的hashCode()方法返回這個物件儲存的記憶體地址的編號。
而equals()比較的是記憶體地址是否相等。
public boolean equals(Object obj){
return (this == obj);
}
在Map,set等容器中,在存取時都需要大量的equals操作,會影響效率。所以引入了hashCode()。
通過hashCode()能夠計算出一個hash值,通過hash值來判斷兩個物件的值是否相等,如果hash值不相等則說明這兩個物件不相等,如果hash值相等則繼續用equals()去判斷兩個物件是否相等 。
編寫一個高效率,高準確率的hashCode可能會比較困難。
示例:
class IntPair{ private int i1; private int i2; public IntPair(int i1, int i2){ this.i1 = i1; this.i2 = i2; } public boolean equals(Object obj){ if(this == obj)//判斷是否是本類的一個引用 return true; if(obj == null)// return false; IntPair pair = (IntPair)obj; if(this.i1 != pair.i1) return false; if(this.i2 != pair.i2) return false; return true; } public int hashCode(){ int result = 17; result = result * 31 + i1; result = result * 31 + i2; return result; } }