[英]Overriding compareTo and Compare in java7
為了滿足Comparable合同,我在Java中重寫CompareTo和Compare方法時是否需要重寫equals()方法? 當我執行Collections.sort或Array.sort時,這會產生任何問題嗎?
從Javadoc for Comparator
通常是這種情況,但並非嚴格要求(compare(x,y)== 0)==(x.equals(y))。 一般而言,任何違反此條件的比較器都應明確指出這一事實。 推薦的語言是“注意:此比較器施加與等式不一致的順序”。
這意味着您通常不需要重寫equals()
。 除非您希望Comparator
對兩個值返回非零比較,而兩個值與equals
比較時返回true
,則您可能不應該這樣做。
如果您認為比較的存在要求您更改兩個事物相等意味着什么的定義,那么您可能設計得很糟糕。
從Comparable
:
當且僅當
e1.compareTo(e2) == 0
C
類的每個e1
和e2
具有與e1.equals(e2)
相同的布爾值時,才可以認為C
類的自然排序與equals一致。 請注意,null
不是任何類的實例,即使e.equals(null)
返回false
,e.compareTo(null)
仍應引發NullPointerException
。強烈建議(盡管不是必需的)自然順序應與equals保持一致 。 之所以如此,是因為沒有顯式比較器的排序集(和排序映射)與自然排序與等式不一致的元素(或鍵)一起使用時,其行為“奇怪”。 特別是,這樣的排序集(或排序圖)違反了根據equals方法定義的集合(或圖)的一般約定。
(強調我的)
因此,您不需要重寫equals()
(即,由於它們僅使用compareTo()
,因此不會在標准sort方法內引起問題,也不會違反Comparable
的約定),但肯定不會受到傷害。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.