還記得最初學習java時,老師動不動就眉飛色舞的向我們講解如何重寫equals、hashCode方法,可自己真的一臉懵逼:
Object源碼分別有 equals() 和 hashcode()方法,爲什麼還需要重寫?
在繼續之前,有人會問:==沒有提及到,也是相等的意思啊,其實這個很好理解:A==B,表示A、B共同指向了同一個內存地址,即:兩個對象所有的數值、hashCode、內存地址等一切東西相同,說白了,就說判斷兩者是否爲同一個對象。
好了,繼續上面的問題,先來看看Object類源碼:
原始Object類中,equals和==的作用無缺別,判斷的都是對象的引用即訪問的內存地址是否相同
hashcode是根據對象的內存地址經哈希算法得來的,
再來看看String類:
至於爲什麼使用了31,請看下面解釋
而HashMap類是這樣:
可以發現:子類重寫了父類Object的equals和hashCode方法,而且方法實現邏輯也不一樣!
Object根類的這兩個方法如果不重寫:
- hashCode:值是根據內存地址換算出來的。
- equals:是嚴格判斷一個對象是否相等的方法(object1 == object2)。
爲什麼需要重寫equals和hashCode方法?
在我們的業務系統中,有時候判斷對象需要的。在這種情況下,原始的equals方法就不能滿足我們的需求了。
Object 的 equals方法判斷的是對象是否爲同一個對象;然後現實業務需要判斷的是內容是否相等,並不是一種嚴格意義上的相等,而是一種業務上的對象相等,所以需要重寫equals()方法,而重寫equals()方法也需要重寫它的先決條件判斷hashcode()方法。