天天看點

哈工大軟體構造-equals()和hashcode()

文章目錄

    • equals()
    • hashcode()
    • equals()和hashcode()
    • 怎樣重寫equals()

equals()

在java中,等價可以分為兩大類:

  1. 引用等價性(==)

    也就是簡單粗暴的判斷引用的位址是否相同

  2. 對象等價性

    也就是判斷兩個對象邏輯上是否等價,也分為兩種方法:行為等價性及觀察等價性。而equals()就是判斷對象等價性。

hashcode()

java中對hashcode()的作用:

hashCode()的作用是為了提高在散列結構存儲中查找的效率,線上性表中沒有作用;隻有每個對象的 hash 碼盡可能不同才能保證散列的存取性能,事實上 Object 類提供的預設實作确實保證每個對象的 hash 碼不同(在對象的記憶體位址基礎上經過特定算法傳回一個 hash 碼)。

java中對hashcode()的規約:

  • 程式執行期間隻要對象 equals 方法比較操作所用到的資訊沒有被修改,則對這同一個對象無論調用多次 hashCode 方法都必須傳回同一個整數。
  • 如果兩個對象根據 equals 方法比較是相等的則調用這兩個對象中任意一個對象的 hashCode 方法都必須産生同樣的整數結果。
  • 如果兩個對象根據 equals 方法比較是不相等的,則調用這兩個對象中任意一個對象的 hashCode 方法不一定要産生相同的整數結果

hashcode()與==的關系

若 == 傳回true,則兩邊的對象的hashCode()傳回值必須相等,若 == 傳回false,則兩邊對象的hashCode()傳回值可能相等,也可能不等,因為Java中對象預設的equals()方法就是用==實作的。

equals()和hashcode()

hashcode()說白了就是類的哈希值,那為什麼重寫equals時要重寫hashcode()。

因為在某些元素不可重複的集合類中(如HashMap,HashSet)為了避免每次添加元素時都要進行複雜的equals()比較,是以會先比較hashcode(),當有已存在元素hashcode()相等時才會進行equals()比較,這樣就大大提升了效率。

但這也使得當我們重寫equals()時,如果不重寫hashcode()會導緻利用hashcode()的集合類無法正常使用。

注: 下面附一張關于HashMap,HashSet的比較流程

哈工大軟體構造-equals()和hashcode()

怎樣重寫equals()

public boolean equals(Object obj) {
		if(obj==this)
			return true;
		if(obj==null)
			return false;
		//假設我要比較的類為try1
		if(! (obj instanceof try1))
			return false;
		try1 other=(try1)obj;
		//這裡填寫對于内部rep的比較
		...
		return false;
	}