Java之equals和hashcode方法

還記得最初學習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()方法。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章