在 Java 中 Object 類是所有類的父類,任何類都會默認繼承 Object 類。
1. " == "
它的作用是判斷兩個對象的內存地址是否相等。如果地址相同則判爲同一個對象。
1.1. 對於基本數據類型類型
基本數據類型 == 比較的是值
1.2. 對於引用數據類型
引用數據類型 == 比較的是內存地址
2. equals()
2.1. 未重寫
equals() 在 Object 類中的默認實現方法是調用 " == ",此時等價於使用 " == " 判斷。
2.2. 重寫了
但通常會重寫這一個方法使之比較對象的內容是否相等,如 String 中就重寫了 equals()方法,使之比較的是內容是否相同。
3. hashCode()
hashCode() 是一個native方法,用於獲取對象的哈希碼的,它返回的是一個int型整數。
hashCode() 保證在一次執行中對同一個對象的hashCode()是一樣的。
hashCode() 的哈希碼主要作用是給散列表快速確定索引的,通過哈希碼先判斷對象是否有可能相同(因爲相同的對象哈希碼也一定相同),再去用 equals() 做進一步的比較,這樣可以大大減少使用 equals()比較的次數。
所以說如果兩個對象相等,則其hashCode()的值也會相等。但由於 hashCode() 是根據內存地址生成的值,所以對於同一個類生成的兩個對象,即使它們裏面的值一樣,但其哈希值是不會相等的,因此當我們重寫 equals() 方法時最好也要重寫 hashCode() 方法,這樣才能保證相同內容的類對象 hashCode() 相等。
可以看到 String 類中就重寫了 hashCode() 方法,通過一個特定的算法來確定其哈希碼。
這樣當我們將 String 作爲 Key 存入哈希表時纔可以準確定位到相同類對象的位置。