1. 程式人生 > >hashcode()和equals()的區別

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()都不同,則肯定不同,這樣對比的效率就很高了

   

總結:

1、equals方法用於比較物件的內容是否相等(覆蓋以後)

2、hashcode方法只有在集合中用到

3、當覆蓋了equals方法時,比較物件是否相等將通過覆蓋後的equals方法進行比較(判斷物件的內容是否相等)。

4、將物件放入到集合中時,首先判斷要放入物件的hashcode值與集合中的任意一個元素的hashcode值是否相等,如果不相等直接將該物件放入集合中。如果hashcode值相等,然後再通過equals方法判斷要放入物件與集合中的任意一個物件是否相等,如果equals判斷不相等,直接將該元素放入到集合中,否則不放入。