天天看點

JavaCore-hashCode和equals若幹問題解答

equals()的作用

equals用來判斷兩個對象是否相等

JDK中定義equals的源碼如下:

public boolean equals(Object obj){
	return (this == obj)
	}
           

在Object中定義了equals方法,所有Java類都實作了equals方法,所有類都可以同步不動equals去比較兩個對象是否相等,但預設的equals方法等價于==方法。

我們需要重寫equals方法,因為我們想比較兩個對象是不是同一個對象

@Override
public boolean equals(Object obj){
	if(obj == null){
		return false;
	}
	
	// 如果是同一個對象的引用,傳回true,反之傳回false
	if(this == obj){
		return ture;
	}
	
	//判斷類型是否相同
	if(this.getClass()!=obj.getClass()){
		return false;
	}

	//判斷值是否相同
	Person person=(Person)obj;
	return name.equals(person.name)&&age ==person.age
	
}
           

如果不複寫equals方法,和 == 無任何差別

hashCode作用:

hashCode的作用是擷取哈希碼,傳回一個int整數,作用是确定該對象在哈希表中的索引位置,

hashCode定義在JDK的Object.java中,任何類都用hashCode函數

僅當建立該類的散清單的時候,該類的hashCode才有用,作用是确定該類的每一個對象在散清單中的位置。

其他情況下hashCode沒有任何作用

散清單是key-value,能根據key快速檢索出對應的value,其實就是利用了hashCode,

散清單本質就是通過數組實作的,當我們擷取散清單的某個key的value,就是要擷取數組中某個key位置的元素,而數組的位置,是通過key隊形的hashCode計算得到的。

HashSet中已經有1000個元素,當插入第1001個元素時,因為是Set集合,允許有重複元素。将1001個元素諸葛和前面1000個元素進行比較,這個效率是相等低下的。散清單很好的解決了這個問題,根據元素的散列碼計算出元素在散清單中的位置,然後将元素插入該位置即可。對于相同元素,自然隻能儲存一個。

在散清單中,如果兩個對象相等,那麼他們的hashCode值一定要相等

如果兩個對象hashcode相等,他們不一定相等。

hashCode和equals之間的關聯

1 不會建立類對應的散清單,不會建立HashSet,HashTable,HashMap等等這些本質是散清單的資料結構,用到該類,hashCode和equals沒有半毛錢關系

equals用來判斷對象是夠相等,hashCode根本沒有任何作用

2會建立類對應的散清單

這種情況下,hashCode和equals是有關聯的

1 兩個對象相等,hashCode值一定相等,這裡的相等是通過equals比較兩個對象return true

2 如果兩個對象的hashCode相等,他們并不一定相等,隻能說明兩個鍵值對應的hashCode相等,然而哈希值相等不能說兩個鍵值對相等。

這種情況下,要判斷兩個對象是否相等,除了要覆寫equals之外,也要覆寫hashCode函數,否則equals無無效

JavaCore-hashCode和equals若幹問題解答
JavaCore-hashCode和equals若幹問題解答