Java 中的 equals,==與 hashCode 的區別與聯系


一. 關系操作符 ==:
若操作數的類型是基本數據類型,則該關系操作符判斷的是左右兩邊操作數的值是否相等
若操作數的類型是引用數據類型,則該關系操作符判斷的是左右兩邊操作數的內存地址是否相同。也就是說,若此時返回true,則該操作符作用的一定是同一個對象。
二. equals 方法:
Java中所有的類都是繼承與Object這個基類的,在Object類中定義了一個equals方法,這個方法的初始行為是比較對象的內存地址,但在一些類庫中已經重寫了這個方法(一般都是用來比較對象的成員變量值是否相同),比如:String,Integer,Date 等類中,所以他們不再是比較類在堆中的內存地址了

對於諸如“字符串比較時用的什么方法,內部實現如何?”之類問題的回答即為:

使用equals方法,內部實現分為三個步驟:

先 比較引用是否相同(是否為同一對象),
再 判斷類型是否一致(是否為同一類型),
最后 比較內容是否一致
Java 中所有內置的類的 equals 方法的實現步驟均是如此,特別是諸如 Integer,Double 等包裝器類。
三. hashCode 方法
由 Object 類定義的 hashCode 方法會針對不同的對象返回不同的整數。
HashCode 只是在需要用到哈希算法的數據結構中才有用,比如 HashSet, HashMap 和 Hashtable。

先調用這個元素的 hashCode 方法,然后根據所得到的值計算出元素應該在數組的位置。如果這個位置上沒有元素,那么直接將它存儲在這個位置上;

如果這個位置上已經有元素了,那么調用它的equals方法與新元素進行比較:相同的話就不存了,否則,將其存在這個位置對應的鏈表中(Java 中 HashSet, HashMap 和 Hashtable的實現總將元素放到鏈表的表頭)。

hashCode和equals方法的區別:

1.equal()相等的兩個對象他們的hashCode()肯定相等,也就是用equal()對比是絕對可靠的。

2.hashCode()相等的兩個對象他們的equal()不一定相等,也就是hashCode()不是絕對可靠的。

因為重寫的equal()里一般比較的比較全面比較復雜,這樣效率就比較低,而利用hashCode()進行對比,則只要生成一個hash值進行比較就可以了,效率很高,那么hashCode()既然效率這么高為什么還要equal()呢?

因為hashCode()並不是完全可靠,有時候不同的對象他們生成的hashcode也會一樣(生成hash值得公式可能存在的問題),所以hashCode()只能說是大部分時候可靠,並不是絕對可靠。

解決方式:

當需要對比的時候,首先用hashCode()去對比,如果hashCode()不一樣,則表示這兩個對象肯定不相等(也就是不必再用equal()去再對比了),如果hashCode()相同,此時再對比他們的equal(),如果equal()也相同,則表示這兩個對象是真的相同了,這樣既能大大提高了效率也保證了對比的絕對正確性。


免責聲明!

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



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