equals與==與hashCode的區別與聯絡
阿新 • • 發佈:2022-04-19
equals與hashcode的區別與聯絡
1."=="與equals的區別與聯絡
(1)“==”對於基本資料型別,只要值相等,就返回true,否則返回false。
若比較的為物件,則判斷的是兩個物件是否處於同一個記憶體地址。
(2)equals為Object類中的方法,Object中equals預設使用來判斷,因此一般來講equals與“”並無區別,完全相同。
Object是所有類的父類,在不少類中都對equals進行了重寫,比如最常用的String類,因此在String中比較的是值,而非地址。 基本型別的包裝型別,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用變數,==是比較地址的,而equals是比較內容的
String 中的equals方法 他重寫了equals方法
2.equals與hashcode的區別與聯絡
在Java中判斷兩個物件是否相等,有兩種方法,一種是通過hashcode,另一種是通過equals
hashCode()方法和equal()方法的作用其實一樣,在Java裡都是用來對比兩個物件是否相等一致,那麼equal()既然已經能實現對比的功能了,為什麼還要hashCode()呢?
因為重寫的equal()裡一般比較全面比較複雜,這樣效率就比較低,而利用hashCode()進行對比,則只要生成一個hash值進行比較就可以了,效率很高,那麼hashCode()既然效率
這麼高為什麼還要equal()呢?
因為hashCode()並不是完全可靠,有時候不同的物件他們生成的hashcode也會一樣(生成hash值得公式可能存在的問題),所以hashCode()只能說是大部分時候可靠,並不是絕對
可靠,所以我們可以得出:
1.equal()相等的兩個物件他們的hashCode()肯定相等,也就是用equal()對比是絕對可靠的。 2.hashCode()相等的兩個物件他們的equal()不一定相等,也就是hashCode()不是絕對可靠的。 所有對於需要大量並且快速的對比的話如果都用equal()去做顯然效率太低,所以解決方式是,每當需要對比的時候,首先用hashCode()去對比,如果hashCode()不一樣,則表示這兩
個物件肯定不相等(也就是不必再用equal()去再對比了),如果hashCode()相同,此時再對比他們的equal(),如果equal()也相同,則表示這兩個物件是真的相同了,這樣既能大大提高了
效率也保證了對比的絕對正確性!
這種大量的並且快速的物件對比一般使用的hash容器中,比如hashset,hashmap,hashtable等等,比如hashset裡要求物件不能重複,則他內部必然要對新增進去的每個物件進行對比,而他的對比規則就是像上面說的那樣,先hashCode(),如果hashCode()相同,再用equal()驗證,如果hashCode()都不同,則肯定不同,這樣對比的效率就很高了。