java中==和equals和hashCode

1 , =='運算符是用來比較兩個變量的值是否相等.也就是說也是在比較兩個變量指向的對象是否是同一對象
2, equals是Object類提供的方法之一.每一個Java類都集成自Object類,所以每一個對象都具有equals這個方法。Object類中定義的equals(Object)方法的情況下,equals(Object)與“= =”運算符一樣,比較的是引用。
相比“= =”運算符,equals(Object)方法的特殊之處就在於它可以被覆蓋,所以可以通過覆蓋的方法讓它不是比較引用而是比較數據內容,例如String類的equals方法是用於比較兩個獨立對象的內容是否相同,即堆中的內容是否相同,以下面的代碼爲例:

		String s1 = new String("Hello");
		String s2 = new String("Hello");
		System.out.println(s1.equals(s2));  // = => true
		System.out.println(s1 == s2);	    // = =>false


	//兩條new語句創建了兩個對象,然後用s1、s2這兩個變量分別指向一個對象,
	//這是兩個不同的對象,它們的首地址是不同的,即s1和s2中存儲的數值是不相同的,
	//所以,表達式s1==s2將返回false,而這兩個對象中的內容是相同的,
	//所以,表達式s1.equals(s2)將返回true。

如果一個類沒有自己定義equals()方法,那麼它將繼承Object類的equals()方法,Object類的equals()方法的實現代碼如下:

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

通過以上例子可以說明,如果一個類沒有自己定義equals()方法,它默認的equals()方法(從Object類繼承的)就是使用“= =”運算符,也是在比較兩個變量指向的對象是否是同一對象,此時使用equals()方法和使用“==”運算符會得到同樣的結果。若比較的是兩個獨立的對象,則總返回false。如果編寫的類希望能夠比較該類創建的兩個實例對象的內容是否相同,那麼必須覆蓋equals()方法,由開發人員自己編寫代碼來決定在什麼情況下即可認爲兩個對象的內容是相同的。

3 hashCode()方法是從Object類中繼承過來的,它也用來鑑定兩個對象是否相等。Object類中的hashCode()方法返回對象在內存中地址轉換成的一個int值,所以如果沒有重寫hashCode()方法,任何對象的hashCode()方法都是不相等的。

雖然equals()方法也是用來判斷兩個對象是否相等的,但是它與hashCode()方法是有區別的。一般來講,equals()方法是給用戶調用的,如果需要判斷兩個對象是否相等的,可以重寫equals()方法,然後在代碼中調用,這樣就可以判斷它們是否相等了。對於hashCode()方法,用戶一般不會去調用它,例如在hashmap中,由於key是不可以重複的,它在判斷key是否重複時就判斷了hashCode()方法,而且也用到了equals()方法。此處“不可以重複”指的是equals()和hashCode()只要有一個不等就可以了。所以,hashCode()方法相當於是一個對象的編碼,就好像文件中的md5,它與equals()方法的不同之處就在於它返回的是int型,比較起來不直觀。

一般在覆蓋equals()方法的同時也要覆蓋hashCode()方法,否則,就會違反Object.hashCode的通用約定,從而導致該類無法與所有基於散列值(hash)集合類(HashMap、HashSet和Hashtable)結合在一起正常運行。

hashCode()方法的返回值和equals()方法的關係: x.equals(y)返回true,即兩個對象根據equals()方法比較是相等的,那麼調用這兩個對象中任意一個對象的hashCode()方法都必須產生同樣的整數結果。如果x.equals(y)返回false,即兩個對象根據equals()方法比較是不相等的,那麼x和y的hashCode()方法的返回值有可能相等,也有可能不相等。反之,hashCode()方法的返回值不相等,一定能推出equals()方法的返回值也不相等,而hashCode()方法的返回值相等,equals()方法的返回值則可能相等,也可能不相等。

發佈了59 篇原創文章 · 獲贊 248 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章