HashCode
首先我們來理解下什么叫hash!Hash,一般翻譯做“散列”,也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。
所以,面試的時候,我們只需要說,HashCode,就是對象通過散列算法生成的固定長度的值!
Equals,==
為啥我要拿Equals和==放在一起說,因為很簡單,在學校我們學的,一般都是==是比較對象的引用地址的,而Equals是用來比較值的,其實這特么是假的!因為我們看源碼就知道Object里面的Equals其實就是判斷==是否為true。為啥說equals值呢,因為Equals被重寫了啊。。。

HashCode,Equals,==三者的關系
1. 如果是基本變量,沒有hashcode和equals方法,基本變量的比較方式就只有==,;
2. 如果是變量,由于在java中所有變量定義都是一個指向實際存儲的一個句柄(你可以理解為c++中的指針),在這里==是比較句柄的地址(你可以理解為指針的存儲地址),而不是句柄指向的實際內存中的內容,如果要比較實際內存中的內容,那就要用equals方法,但是?。?!
如果是你自己定義的一個類,比較自定義類用equals和==是一樣的,都是比較句柄地址,因為自定義的類是繼承于object,而object中的equals就是用==來實現(xiàn)的,你可以看源碼。
那為什么我們用的String等等類型equals是比較實際內容呢,是因為String等常用類已經(jīng)重寫了object中的equals方法,讓equals來比較實際內容,你也可以看源碼。
3. 從語法角度,也就是從強制性的角度來說,hashCode和equals是兩個獨立的,互不隸屬,互不依賴的方法,equals成立與hashCode相等這兩個命題之間,誰也不是誰的充分條件或者必要條件。
但是,從為了讓我們的程序正常運行的角度,我們應當向Effective? Java中所言
重載equals的時候,一定要(正確)重載hashCode
使得equals成立的時候,hashCode相等,也就是a.equals(b)->a.hashCode()? ==? b.hashCode(),或者說此時,equals是hashCode相等的充分條件,hashCode相等是equals的必要條件(從數(shù)學課上我們知道它的逆否命題:hashCode不相等也不會equals),但是它的逆命題,hashCode相等一定equals以及否命題不equals時hashCode不等都不成立。
總結
總結一下,equals()是對象相等性比較,hashCode()是計算對象的散列值,當然他們的依據(jù)是對象的屬性。
對于equals,一般我們認為兩個對象同類型并且所有屬性相等的時候才是相等的,在類中必須改寫equals,因為Object類中的equals只是判斷兩個引用變量是否引用同一對象,如果不是引用同一對象,即使兩個對象的內容完全相同,也會返回false。當然,在類中改寫這個equals時,你也可以只對部分屬性進行比較,只要這些屬性相同就認為對象是相等的。
對于hashCode,只要是用在和哈希運算有關的地方,前面很多兄弟都提到了,和equals一樣,在你的類中也應該改寫。當然如果兩個對象是完全相同的,那么他們的hashCode當然也是一樣的,但是象前面所述,規(guī)則可以由你自己來定義,因此兩者之間并沒有什么必然的聯(lián)系。