Java,哈希碼以及equals和==的區別


    從開始學習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()比較的是哈希碼,而哈希碼生成
的標准是由類作者自己根據需求來控制的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM