區別
- == 一般用來比較物件的jvm地址是否一致,同物件相等(注意常量引用)
- equals 檢視Object原始碼,預設直接呼叫==比較的也是物件地址,不同子類可以重寫該方法,比如String
分兩步
- 先比較物件地址
- 如果不是相同物件,則挨個比較字串的每一個字元是否相同
3. hashcode 預設情況返回物件jvm32位儲存地址
- 順序表問題
對於順序表,如陣列,當查詢元素時需要挨個遍歷查詢,線性查詢效率很低
- 解決方案
已知在陣列中,元素位置與index關聯,與元素無關
如果將元素位置與元素構建某種關聯,意味著每個元素只要儲存到資料結構中,就能獲取它的位置,位置已經被確定,查詢效率更高。給每一個元素在表中確定一個唯一的位置的解決方案是雜湊表。
利用雜湊函式,每一個元素能得到一個雜湊值,根據雜湊值在表中確認一個位置。(用例:檢視hashmap原始碼可以發現hashmap根據雜湊演算法確定桶的位置)
重寫equals
一般使用equals來比較兩個物件是否等價,所以類都會重寫equals
重寫原則:
- 自反性,自己與自己比較為true
- 對 null,false
- 傳遞性,a與b相等,b與c相等,a與c一定相等
- 對稱性,a與b相等,b與a相等
重寫hashcode
為了遵守兩個物件equals相同,hashcode也相同的規則,所以重寫equals必須重寫hashcode
注意事項:
- hashcode返回一個整型,防止溢位
- 不同物件的hashcode最好不同,為了提高hashmap等集合的效率,當出現雜湊衝突時,根據hashmap的資料結構陣列+連結串列(紅黑樹),會變成線性查詢,效率降低
當User有重寫equals和hashcode第二次結果為null