基本概念
- 要比較兩個對象是否相等時須要調用對象的equals() 方法:
- 對象地址相等時, 那麼對象相關的數據也相等,包括:
- 能夠經過比較對象的地址來判斷對象是否相等
Object源碼
- 對象在不重寫的狀況下使用的是Object中的equals() 方法和hashCode() 方法
- equals(): 判斷的是兩個對象的引用是否指向同一個對象
- hashCode(): 根據對象地址生成一個整數數值
- Object的hashCode() 方法修飾符爲native: 代表該方法是由操做系統實現. Java調用操做系統底層代碼獲取Hash值
public native int hashCode();
複製代碼
重寫equals
- 重寫equals()方法的場景:
- 假設如今有不少學生對象
- 默認狀況下,要判斷多個學生對象是否相等,須要根據地址判斷:
- 判斷相等的要求:
- 當學生的姓名,年齡,性別相等時,認爲對象是相等的,
- 不必定須要對象的地址徹底相同
- 重寫了equals() 方法後,這裏會輸出 [s1==s2]
- 若是沒有重寫 equals() 方法,那麼一定會輸出 [s1!=s2]
重寫hashCode
原理分析
- 由於沒有重寫父類的Object的hashCode() 方法,因此Object的hashCode() 方法會根據兩個對象的地址生成響應的hashcode
- 因爲兩個對象分別是實體類建立的不一樣的實例,因此地址確定是不同的,那麼hashcode值也是不同的
- Set區別對象是否是惟一的標準:
- 兩個對象的hashcode值是否同樣
- 而後再斷定兩個對象是否equals
- Map區別對象是否是惟一的標準:
- 先根據Key值的hashcode分配來獲取保存數組下標
- 而後再根據eaquals區分是不是惟一值
HashMap
HashMap組成結構
HashMap的存儲
- HashMap的存儲:
- 一個對象存儲到HashMap中的位置是由key的hashcode值決定的
- HashMap查找key:
- 查找key時 ,hashMap會先根據key值的hashcode通過取餘算法定位所在數組的位置
- 而後根據key的equals方法匹配相同的key值獲取相應的對象
- 存值規則:
- 將Key的hashcode與HashMap的容量,進行取餘運算得出該Key存儲在數組所在位置的下標
- HashMap查找key:
- 獲得key在數組中的位置
- 匹配獲得對應key值對象
- 而後將上述多個對象根據key.equals() 來匹配獲取對應的key的數據對象
- HashMap中的hashCode:
- 若是沒有hashcode就意味着HashMap存儲的時候是沒有規律可循的
- 這樣每次使用map.get() 方法,就要將map裏的對象一一進行equals匹配,致使效率低下