==、equals、hashcode總結

Echizen_1發表於2019-03-31

區別

  1. == 一般用來比較物件的jvm地址是否一致,同物件相等(注意常量引用)
  2. equals 檢視Object原始碼,預設直接呼叫==比較的也是物件地址,不同子類可以重寫該方法,比如String

==、equals、hashcode總結

分兩步

  • 先比較物件地址
  • 如果不是相同物件,則挨個比較字串的每一個字元是否相同

  3. hashcode 預設情況返回物件jvm32位儲存地址

  • 順序表問題

對於順序表,如陣列,當查詢元素時需要挨個遍歷查詢,線性查詢效率很低

  • 解決方案

已知在陣列中,元素位置與index關聯,與元素無關

如果將元素位置與元素構建某種關聯,意味著每個元素只要儲存到資料結構中,就能獲取它的位置,位置已經被確定,查詢效率更高。給每一個元素在表中確定一個唯一的位置的解決方案是雜湊表。

利用雜湊函式,每一個元素能得到一個雜湊值,根據雜湊值在表中確認一個位置。(用例:檢視hashmap原始碼可以發現hashmap根據雜湊演算法確定桶的位置)

重寫equals

一般使用equals來比較兩個物件是否等價,所以類都會重寫equals

重寫原則:

  1. 自反性,自己與自己比較為true
  2. 對 null,false
  3. 傳遞性,a與b相等,b與c相等,a與c一定相等
  4. 對稱性,a與b相等,b與a相等

重寫hashcode

為了遵守兩個物件equals相同,hashcode也相同的規則,所以重寫equals必須重寫hashcode

注意事項:

  1. hashcode返回一個整型,防止溢位
  2. 不同物件的hashcode最好不同,為了提高hashmap等集合的效率,當出現雜湊衝突時,根據hashmap的資料結構陣列+連結串列(紅黑樹),會變成線性查詢,效率降低

==、equals、hashcode總結

當User有重寫equals和hashcode第二次結果為null


相關文章