日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java,哈希码以及equals和==的区别

發布時間:2024/1/1 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()比較的是哈希碼,而哈希碼生成 的標準是由類作者自己根據需求來控制的。

總結

以上是生活随笔為你收集整理的Java,哈希码以及equals和==的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。