Java 比較(==, equals) 一、= = ==:比較兩個對象的引用是否是同一個地址 二、equals object中equals方法調用的就是==,可以在其他類中重寫該方法。 三、為什麼要重寫equals要重寫hashcode方法 因為散列集合插入對象時會進行判斷,先調用hashcode, ...
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 方法才行。