java equal hashcode_Java(二)equal 和 hashcode使用
一、hashCode()和equals()是什么?
hashCode()方法和equals()方法的作用其實一樣,在Java里都是用來對比兩個對象是否相等一致。
Equal
沒有重寫的equal 使用是繼承自 Object 的 equal 方法,和 “==” 的作用一樣, 比較兩個對象的內存地址是否相等。
public boolean equals(Object obj) {
return (this == obj);
}
重寫過的 equal, 比較的是兩個對象的屬性變量值 是否相等。
HashCode
hashCode是對象在內存地址通過hash算法得到的哈希碼。
二、hashCode()和equals()的區別
下邊從兩個角度介紹了他們的區別:一個是性能,一個是可靠性。他們之間的主要區別也基本體現在這里。
1、equals()既然已經能實現對比的功能了,為什么還要hashCode()呢?
因為重寫的equals()里一般比較的比較全面比較復雜,這樣效率就比較低,而利用hashCode()進行對比,則只要生成一個hash值進行比較就可以了,效率很高。
2、hashCode()既然效率這么高為什么還要equals()呢?
因為hashCode()并不是完全可靠,有時候不同的對象他們生成的hashcode也會一樣(生成hash值得公式可能存在的問題),所以hashCode()只能說是大部分時候可靠,并不是絕對可靠,所以我們可以得出(PS:以下兩條結論是重點,很多人面試的時候都說不出來):
equals()相等的兩個對象他們的hashCode()肯定相等,也就是用equals()對比是絕對可靠的。
hashCode()相等的兩個對象他們的equals()不一定相等,也就是hashCode()不是絕對可靠的。
三、hashCode()和equals()使用的注意事項
1、對于需要大量并且快速的對比的話如果都用equals()去做顯然效率太低,所以解決方式是,每當需要對比的時候,首先用hashCode()去對比,如果hashCode()不一樣,則表示這兩個對象肯定不相等(也就是不必再用equals()去再對比
了),如果hashCode()相同,此時再對比他們的equals(),如果equals()也相同,則表示這兩個對象是真的相同了,這樣既能大大提高了效率也保證了對比的絕對正確性!
2、這種大量的并且快速的對象對比一般使用的hash容器中,比如HashSet,HashMap,HashTable等等,比如HashSet里要求對象不能重復,則他內部必然要對添加進去的每個對象進行對比,而他的對比規則就是像上面說的那樣,先hashCode(),如果hashCode()相同,再用equals()驗證,如果hashCode()都不同,則肯定不同,這樣對比的效率就很高了。
3、然而hashCode()和equals()一樣都是基本類Object里的方法,而和equals()一樣,Object里hashCode()里面只是返回當前對象的地址,如果是這樣的話,那么我們相同的一個類,new兩個對象,由于他們在內存里的地址不同,則他們的
hashCode()不同,所以這顯然不是我們想要的,所以我們必須重寫我們類的hashCode()方法,即一個類,在hashCode()里面返回唯一的一個hash值,比如下面:
由于標識這個類的是他的內部的變量num和name,所以我們就根據他們返回一個hash值,作為這個類的唯一hash值。
所以如果我們的對象要想放進hashSet,并且發揮hashSet的特性(即不包含一樣的對象),則我們就要重寫我們類的hashCode()和equals()方法了。像String,Integer等這種類內部都已經重寫了這兩個方法。
當然如果我們只是平時想對比兩個對象 是否一致,則只重寫一個equals(),然后利用equals()去對比也行的
4、什么時候需要重寫?
一般的地方不需要重載hashCode,只有當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時才會重載hashCode。
5、那么為什么要重載hashCode呢?
如果你重寫了equals,比如說是基于對象的內容實現的,而保留hashCode的實現不變,那么很可能某兩個對象明明是“相等”,而hashCode卻不一樣。
這樣,當你用其中的一個作為鍵保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一個作為鍵值去查找他們的時候,則根本找不到。
6、為什么equals()相等,hashCode就一定要相等,而hashCode相等,卻不要求equals相等?
因為是按照hashCode來訪問小內存塊,所以hashCode必須相等。
HashMap獲取一個對象是比較key的hashCode相等和equals為true。
之所以hashCode相等,卻可以equal不等,就比如ObjectA和ObjectB他們都有屬性name,那么hashCode都以name計算,所以hashCode一樣,但是兩個對象屬于不同類型,所以equals為false。
7、為什么需要hashCode?
通過hashCode可以很快的查到小內存塊。
通過hashCode比較比equals方法快,當get時先比較hashCode,如果hashCode不同,直接返回false。
------------------------------------------
總結
以上是生活随笔為你收集整理的java equal hashcode_Java(二)equal 和 hashcode使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: A2的纸张是大的尺寸?谢谢!
- 下一篇: 判开头的成语有哪些啊?