1. 程式人生 > >java HashMap用自定義類作為key

java HashMap用自定義類作為key

用自定義類作為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;
	}
}