==和equals的用法,以及hashcode方法

==操作符專門用來比較兩個變量的值是否相等,也就是用於比較變量所對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否相當,只能用==操作符。
equals方法是用於比較兩個獨立對象的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個對象是獨立的。字符串Stirng比較要用equals方法。例如,對於下面的代碼:

  String a=new String("foo");
  String b=new String("foo");

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

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

boolean equals(Object o){

return this==o;

}

這說明,如果一個類沒有自己定義equals方法,它默認的equals方法(從Object類繼承的)就是使用==操作符,也是比較兩個變量指向的對象是否是同一個對象,這時候使用equals和使用==會得到同樣的結果,如果比較的是兩個獨立的對象則總返回false。如果你編寫的類希望能夠比較該類創建的兩個實例對象的內容是否相同,那麼你必須覆蓋equals方法

hashCode和equals方法的區別與聯繫:
上面說到,如果你自定義的類沒有重寫equals方法,那麼用==和equals比較new 的兩個對象都會是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()方法的返回值則可能相等,也可能不相等。

覆蓋equals時總要覆蓋hashCode
一個很常見的錯誤根源在於沒有覆蓋hashCode方法。在每個覆蓋了equals方法的類中,也必須覆蓋hashCode方法。如果不這樣做的話,就會違反Object.hashCode的通用約定,從而導致該類無法結合所有基於散列的集合一起正常運作,這樣的集合包括HashMap、HashSet和Hashtable。
在應用程序的執行期間,只要對象的equals方法的比較操作所用到的信息沒有被修改,那麼對這同一個對象調用多次,hashCode方法都必須始終如一地返回同一個整數。在同一個應用程序的多次執行過程中,每次執行所返回的整數可以不一致。
如果兩個對象根據equals()方法比較是相等的,那麼調用這兩個對象中任意一個對象的hashCode方法都必須產生同樣的整數結果。
如果兩個對象根據equals()方法比較是不相等的,那麼調用這兩個對象中任意一個對象的hashCode方法,則不一定要產生相同的整數結果。但是程序員應該知道,給不相等的對象產生截然不同的整數結果,有可能提高散列表的性能。

參考博文:
http://blog.csdn.net/Dove_Knowledge/article/details/71027170
http://blog.csdn.net/tiantiandjava/article/details/46988461

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