Java 比較(==, equals)
一、= =
==:比較兩個物件的參考是否是同一個地址
二、equals
object中equals方法呼叫的就是==,可以在其他類中重寫該方法,
三、為什么要重寫equals要重寫hashcode方法
因為散列集合插入物件時會進行判斷,先呼叫hashcode,如果相同,再呼叫equals,如果都相同則只插入一個,
如果只重寫了 equals 方法,那么默認情況下,散列集合(HashMap、LinkedHashMap、HashSet、 LinkedHashSet )進行去重操作時,會先判斷兩個物件的 hashCode 是否相同,此時因為沒有重寫 hashCode 方法,所以直接執行 Object 中的 hashCode 方法,而 Object 中的 hashCode 方法對比的是兩個物件的參考地址,顯然是不同的,所以結果是 false,那么導致 equals 方法就不執行了,直接回傳的結果就是 false,所以兩個物件不是相等的,于是就在散列集合中插入了兩個相同的物件,(顯然是錯誤的)
但是,如果在重寫 equals 方法時,也重寫了 hashCode 方法,那么在執行判斷時會去執行重寫的 hashCode 方法,此時對比的是兩個物件的所有屬性的 hashCode 是否相同,于是呼叫 hashCode 回傳的結果就是 true,再去呼叫 equals 方法,發現兩個物件確實是相等的,于是就回傳 true 了,因此散列集合就不會存盤兩個一模一樣的資料了,于是整個程式的執行就正常了,
總結
hashCode 和 equals 兩個方法是用來協同判斷兩個物件是否相等的,采用這種方式的原因是可以提高程式插入和查詢的速度,如果在重寫 equals 時,不重寫 hashCode,就會導致在某些場景下,比如將兩個相等的自定義物件存盤在散列集合時,就會出現程式執行的例外,為了保證程式的正常執行,所以我們就需要在重寫 equals 時,也一并重寫 hashCode 方法才行,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/547379.html
標籤:其他
