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方法
?
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()都不同,則肯定不同,這樣對比的效率就很高了。
總結
以上是生活随笔為你收集整理的equals与hashcode的区别与联系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java linux socket编程_
- 下一篇: Codeforces Round #49