當我重寫java中的CompareTo和Compare方法以滿足Comparable合同時是否需要重寫equals()方法?當我執行Collections.sort或Array.sort時,這會造成什麼問題嗎?在java7中覆蓋compareTo和Compare比較
0
A
回答
1
的自然順序一類
C
被認爲是與等號當且僅當e1.compareTo(e2) == 0
對每一個e1
和C
類的e2
相同的布爾值e1.equals(e2)
一致。請注意,null
不是任何類的實例,並且e.compareTo(null)
應拋出NullPointerException
,即使e.equals(null)
返回false
。強烈建議(儘管不要求)自然排序與等於一致。這是因爲排序集合(和排序映射)沒有顯式比較器時,它們與自然排序與equals不一致的元素(或鍵)一起使用時表現得「奇怪」。特別是,這樣的有序集合(或有序映射)違反了集合(或映射)的一般契約,它是用等價方法定義的。
(重點煤礦)
所以,你不需要覆蓋equals()
(即它不會在標準排序方法中引起問題,因爲它們只用compareTo()
,也不會違反合同Comparable
),但它肯定不會受到傷害。
2
從的Javadoc Comparator
它通常是這種情況,但並不嚴格要求(比較(X,Y)== 0)==(x.equals(Y))。一般而言,任何違反此條件的比較器都應明確指出這一事實。推薦的語言是「注意:這個比較器強加與等號不一致的排序」。
這意味着您通常不需要覆蓋equals()
。除非您希望Comparator
返回true
與equals
相比較的兩個值的非零比較,否則您可能不應該這樣做。
如果您認爲比較的存在需要您改變兩個事物平等的含義的定義,那麼您可能已經設計了很糟糕的東西。
相關問題
- 1. compareTo和compare比較工作如何?
- 2. 覆蓋compareTo(T t)
- 3. ArrayList比較器compareTo
- 4. 的CompareTo()和比較()比較的方法和可比
- 5. 覆蓋Backbone.js比較器
- 6. 覆蓋等於和比較字符串
- 7. 如何覆蓋compareTo方法
- 8. 覆蓋等價比較在Javascript
- 9. 無法@覆蓋Java中的compareTo()方法
- 10. 擴展可比的界面並覆蓋compareTo
- 11. F#集合的覆蓋比較
- 12. Intelij比較兩個覆蓋率數據
- 13. 子串與std :: memcmp或string :: compare比較?
- 14. 使用Equal方法覆蓋CompareTo
- 15. 在自定義創建的比較器中執行compare()方法
- 16. Java get String CompareTo作爲比較對象
- 17. 日期比較失敗d1.compareTo(d2)
- 18. compareTo()方法如何比較字符串?
- 19. SQL比較兩列和覆蓋值以跟蹤最大值
- 20. dotCover:重構之前和之後的代碼覆蓋率比較
- 21. 比較兩個列表和覆蓋/從另一個附加
- 22. 錯誤:在汽車compareTo(對象)無法實現比較(T)在比較
- 23. 爲什麼Java中的字符串比較(CompareTo)比C#更快?
- 24. 當有多種方法比較兩個相同類型的對象時,覆蓋CompareTo?
- 25. 如何在compareTo()中做更多的比較?
- 26. JAVA如何在本練習中比較使用compareTo的整數
- 27. 在java中比較兩個字符串 - 的compareTo
- 28. 試圖覆蓋Java中的PriorityQueue的現有比較器
- 29. 比較兩個對象以覆蓋其中一個的值
- 30. 覆蓋JavaScript中比較運算符的默認行爲
當我有排序對象的集合,通過使用不同的比較。在這種情況下不止一種方法e1.compareTo(E2)== 0將不一樣e1.equals(E2)。 ..在這種情況下,如果我使用類對象作爲集合的鍵會導致任何問題? –
@paulb你在使用什麼類型的集合? – arshajii
我使用ArraList .. –