equals()反映的是對象或變量具體的值,即兩個對象里面包含的值--可能是對象的引用,也可能是值類型的值。
而hashCode()是對象或變量通過哈希算法計算出的哈希值。
之所以有hashCode方法,是因為在批量的對象比較中,hashCode要比equals來得快,很多集合都用到了hashCode,
比如HashTable。
兩個obj,如果equals()相等,hashCode()一定相等。
兩個obj,如果hashCode()相等,equals()不一定相等(Hash散列值有沖突的情況,雖然概率很低)。
所以:
可以考慮在集合中,判斷兩個對象是否相等的規(guī)則是:
第一步,如果hashCode()相等,則查看第二步,否則不相等;
第二步,查看equals()是否相等,如果相等,則兩obj相等,否則還是不相等。
- 首先equals()和hashcode()這兩個方法都是從object類中繼承過來的。
equals()是對兩個對象的地址值進行的比較(即比較引用是否相同)。
hashCode()是一個本地方法,它的實現(xiàn)是根據(jù)本地機器相關(guān)的。
-
Java語言對equals()的要求如下,這些要求是必須遵循的:
對稱性:如果x.equals(y)返回是true,那么y.equals(x)也應(yīng)該返回是true。
反射性:x.equals(x)必須返回是true。
類推性:如果x.equals(y)返回是true,而且y.equals(z)返回是true,那么z.equals(x)也應(yīng)該返回是true。
一致性:如果x.equals(y)返回是true,只要x和y內(nèi)容一直不變,不管你重復(fù)x.equals(y)多少次,返回都是true。
任何情況下,x.equals(null),永遠返回是false;x.equals(和x不同類型的對象)永遠返回是false。
equals()相等的兩個對象,hashcode()一定相等;反過來:hashcode()不等,一定能推出equals()也不等;
hashcode()相等,equals()可能相等,也可能不等。
1、 為什么要重載equal方法?
答案:因為Object的equal方法默認是兩個對象的引用的比較,意思就是指向同一內(nèi)存,地址則相等,否則不相等;如果你現(xiàn)在需要利用對象里面的值來判斷是否相等,則重載equal方法。
2、 為什么重載hashCode方法?
答案:一般的地方不需要重載hashCode,只有當類需要放在HashTable、HashMap、HashSet等等hash結(jié)構(gòu)的集合時才會重載hashCode,那么為什么要重載hashCode呢?就HashMap來說,好比HashMap就是一個大內(nèi)存塊,里面有很多小內(nèi)存塊,小內(nèi)存塊里面是一系列的對象,可以利用hashCode來查找小內(nèi)存塊hashCode%size(小內(nèi)存塊數(shù)量),所以當equal相等時,hashCode必須相等,而且如果是object對象,必須重載hashCode和equal方法。
3、 為什么equals()相等,hashCode就一定要相等,而hashCode相等,卻不要求equals相等?
答案:1、因為是按照hashCode來訪問小內(nèi)存塊,所以hashCode必須相等。
2、HashMap獲取一個對象是比較key的hashCode相等和equal為true。
之所以hashCode相等,卻可以equal不等,就比如ObjectA和ObjectB他們都有屬性name,那么hashCode都以name計算,所以hashCode一樣,但是兩個對象屬于不同類型,所以equal為false。
4、 為什么需要hashCode?
1、通過hashCode可以很快的查到小內(nèi)存塊。
2、通過hashCode比較比equal方法快,當get時先比較hashCode,如果hashCode不同,直接返回false。
hashCode()的作用
參考
HashCode和equal方法的區(qū)別和聯(lián)系(一)
HashCode和equal方法的區(qū)別和聯(lián)系(二)