12
A
回答
16
4
Object類的equals方法實現對象上最可能的等價關係;也就是說,對於任何非空引用值x和y,當且僅當x和y引用同一對象(x == y的值爲true)時,此方法返回true。
爲了測試兩個對象在等價意義上是否相等(包含相同的信息),您必須重寫equals()方法。如果身份運算符不適合您,則應始終覆蓋equals()方法類。
請注意,無論何時重寫此方法,通常都需要重寫hashCode方法,以便維護hashCode方法的一般約定,該方法聲明相等對象必須具有相同的哈希代碼。
5
如果有意義,只能覆蓋equals()
。但很明顯,如果您覆蓋equals()
,則需要確保hashcode()
合同沒有中斷,這意味着如果兩個對象相同,它們必須具有相同的散列碼。
它什麼時候有意義?當Object.equals()
不足時。該方法基本上可以歸結爲參考身份,這意味着兩個對象是相同的對象,以便:
數字是一個明顯的例子,當它是有意義的,因爲Integer(10)
應等於另一個Intger(10)
。
另一個示例可能是您代表數據庫記錄時。假設您的學生記錄具有唯一的整數ID,那麼可能是就足夠執行等於只是比較ID字段。
2
雖然不應該依賴IDE,但Eclipse通過按alt + shift + s並選擇equals和hashCode菜單選項來提供此功能。還有一個toString選項。由Josh Bloch提供的Effective Java有關於此主題的更多信息。該鏈接會將您帶到討論此主題的Google圖書上的章節。
相關問題
- 1. 在Java中重寫hashCode()時應該重寫'equals'(Object)方法嗎?
- 2. 設計不當的應用程序:我們應該重寫嗎?
- 3. 我應該在JPA實體中編寫equals()方法嗎?
- 4. 當它們是.equals()時,Java整數總是==嗎?
- 5. 我應該總是使用GL_CULL_FACE嗎?
- 6. 我應該總是使用webservice嗎?
- 7. 我應該總是使用HTML Doctypes嗎?
- 8. 我應該重寫==對象和MyType嗎?
- 9. 'ImportDeclaration.moduleSpecifier`應該總是StringLiterial嗎?
- 10. 我們應該開源嗎?
- 11. HandlerThread應該重寫run()嗎?
- 12. 我應該使用基於java的重寫而不是mod_rewrite嗎?
- 13. 我應該用GTK +而不是WinForms for Mono重寫GUI嗎?
- 14. 我應該總是removeEventListener?
- 15. 我應該使用回調還是應該重寫屬性?
- 16. 我應該大寫我的常量嗎?
- 17. 我應該關注這個compareTo/equals/hashCode實現嗎?
- 18. EventHandler應該總是用於事件嗎?
- 19. SQL VIEW應該總是在1NF中嗎?
- 20. 什麼是重寫equals()和hashCode()的POJO?
- 21. 我們應該直接使用ScalaSignature嗎?
- 22. 我們應該使用jms嗎?
- 23. 我們應該引入BizTalk/ESB嗎?
- 24. AS3類 - 我應該使用它們嗎?
- 25. 我們還應該爲MSIE7開發嗎?
- 26. 我們應該使用CSS框架嗎?他們值得嗎?
- 27. 我們總是需要關閉我們提供的ModelViewViewController嗎?
- 28. 如果我重載equals應該仍然覆蓋java中的haschode?
- 29. 我們是否應該總是關閉JBoss應用程序客戶端的javax.naming.InitialContext?
- 30. 重建Lucene索引時,我應該總是使用新目錄嗎?