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)容一直不變络拌,不管你重復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)系(二)