從開始學習Java,哈希碼以及equals和==的區別就一直困擾着我。 要想明白equals和==的區別首先應該瞭解什麼是哈希碼,由於在jdk的類庫中無論是object實現的equals()方法仍是String重寫的equals()方法以及
其它基本數據類型的包裝類重寫的euqals()方法,他們在比較對象的時候都是根據hashCode()方法返回的哈希碼來判斷兩個對象是否相等的,因此要想搞清楚
equals()就必需要知道什麼是哈希碼。 那麼到底是什麼哈希碼呢?哈希碼是能夠根據的本身的需求,採用不一樣的算法產生的一個Int型數字。Object的hashCode()方法返回的哈希碼是根據對
象的內存地址來生成的,因此每一個對象的哈希碼是不相同的,若是你要比較的兩個變量的類型沒有重寫Object的hashCode()方法那麼這兩個變量除非是指向
相同的對象(地址相同),不然返回的必定是false。而String以及基本數據類型的包裝類中都重寫了hashCode()方法,他們生成的哈希碼是跟他們的內容
(這裏就是指值)息息相關,也就是說在用equals()比較兩個變量是否相等的時候只要他們的值相等,那麼就返回true,由於他們生成的哈希碼相等。有個
值得注意的地方是:在JDK的類中只要重寫的Object的equals()方法,那就確定重寫了它的hashCode()方法,由於equals()方法中在比較兩個變量時,
判斷的標準就是哈希碼是否同樣,Object中的hashCode()方法是根據對象的內存地址生成的,若是重寫了equals()方法而繼續使用原來的hashCode()方
法生成的哈希碼做爲判斷相等的依據,那顯然達不到咱們要改變判斷對象是否相等的標準的效果。 既然知道了什麼是哈希碼,如今就能夠說明equals()和==的區別了,對於沒用重寫Object的equals()方法的類型所生成的對象的比較,equals()
和==是效果同樣的,==比較的是兩個變量所指向的對象在內存中指向的地址是否同樣,而當兩個變量的類型中繼承了Object的equals()方法的時候,因爲
該方法比較的標準是看哈希碼是否相等,而哈希碼是由hashCode()方法生成的,該方法生成哈希碼的依據是對象在內存中的地址,最終比較的仍是地址。所
以說equals()和==效果同樣。而對於像String和那些基本數據類型的包裝類來講equals()和==就不同了,由於他們重寫了Object的equals()方法和
hashCode()方法,使得equals()方法的判斷標準發生了改變,他們的判斷標準是看對象的內容是否相等,這裏就是指值是否是同樣,由於他們的哈希碼是
根據對象的值生成的,與內存地址無關了,因此他們的equals()方法比較的是對象的值是否相等,而==比較的仍然是地址。因此equals()和==就不同了。 這裏還要注意一下,在比較值的時候,通常==比較的是基本數據類型,而equals()比較的是引用數據類型,地址相同必定值相等,而值相等地址不必定
相同。若是比較的是地址,那最好是用==,由於不管是否重寫了Object的equals()方法,==永遠比較的是地址,equals()比較的是哈希碼,而哈希碼生成
的標準是由類做者本身根據需求來控制的。