Object類-equals()、==、hashCode()

老狐狸船長發表於2014-03-12

一、Object類簡介

java.lang包中定義的Object類是所有Java類的根父類,其中定義了一些實現和支援物件導向機制的重要方法。任何Java物件,如果沒有父類,就預設它繼承了Object類。因此,實際上,以前的定義是下面的簡略:

Java程式碼
public class A extends Object{}

 

二、equals方法

Object類定義的equals方法用於判別某個指定的物件與當前物件(呼叫equals方法的物件)是否等價。資料等價的基本含義是指兩個資料的值相等。

 

三、equals方法與“==”運算子的關係

1、equals()方法只能比較引用型別,“==“可以比較引用型別及基本型別;

2、預設的equals()方法比較的是記憶體地址,基本等同於”==“,但對於類File、String、Date及包裝類來說,是比較的值而不是記憶體地址,這是因為它們內部覆蓋實現了equals()方法;

3、”==“進行比較的時候,引用型別資料比較的是引用即記憶體地址,基本資料型別比較的是值。它是會自動的去進行轉換的。

 

四、覆蓋equals()方法

覆蓋之前equals和==比較的都是記憶體地址,覆蓋equal的一般步驟如下:

(1)、用==檢查是否引數就是這個物件的引用;

(2)、判斷要比較的物件是否為null,如果是null,返回false;

(3)、用instanceof判斷引數的型別是否正確;

(4)、把引數轉換成合適的型別;

(5)、比較物件屬性值是不是匹配。

 

Java程式碼  
private String uuid;
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		T3 other = (T3) obj;
		if (uuid == null) {
			if (other.uuid != null)
				return false;
		} else if (!uuid.equals(other.uuid))
			return false;
		return true;
	}

重要規則:覆蓋equals()應該連帶覆蓋hashcode()

 

五、什麼是hashCode?

實際上,由Object類定義的hashCode方法確實會針對不同的物件返回不同的整數。(這一般是通過將該物件的內部地址轉換成一個整數來實現的,但是Java程式語言不需要這種實現技巧)你可以這樣理解hashCode,它獲取物件在記憶體中的地址並加以某種演算法而計算得來,它是物件的雜湊碼值。主要用來在集合中實現快速查詢等操作,也可以用於物件的比較。

在Java中對hashCode的規定如下:

1、在同一個應用程式執行期間,對同一個物件呼叫hashCode(),必須返回相同的整數結果。至於同一個應用程式在不同執行期所得的結果無需一致;

2、如果兩個物件被equals(Object)方法視為相等,那麼對這兩個物件呼叫hashCode()必需返回相同的整數結果;

3、如果兩個物件被equals(Object)方法視為不相等,那麼對這兩個物件呼叫hashCode()必須獲得相同的整數結果。

相關文章