在實現Comparator
和Comparable
接口,是它必須確保:合同和可比
如果
x.compare(Object obj1, Object obj2) == x.compare(Object obj3, Object obj2)
或
obj1.compareTo(obj2) == obj3.compareTo(obj2)
,
then obj1.equals(obj3)
must be true
?
在實現Comparator
和Comparable
接口,是它必須確保:合同和可比
如果
x.compare(Object obj1, Object obj2) == x.compare(Object obj3, Object obj2)
或
obj1.compareTo(obj2) == obj3.compareTo(obj2)
,then obj1.equals(obj3)
must be true
?
不一定。
什麼你所描述的是transitive relation三者之間給出的對象,as far asboth of the interfaces,而使用他們必須他們之間傳遞的來講,關係。
這就是說,由於三類A
,B
和C
是相互之間具有可比性,如果A.compareTo(B) == 0 && B.compareTo(C) == 0
,然後A.compareTo(C) == 0
。 Comparator
也適用同樣的原則。
你現在正在混淆的是compareTo
和equals
之間的區別。雖然這兩個是密切相關的,沒有任何強制執行文檔中提供的very strong recommendation:
強烈建議,但並不嚴格要求(
x.compareTo(y)==0) == (x.equals(y)
)。一般而言,任何實現接口並違反此條件的類應清楚地指出這一事實。推薦的語言是「注意:這個類的自然排序與equals不一致」。
這當然是可能的和有效的有一個equals
定義與compareTo
甚至compare
不一致,但根據程序的性質,它可以導致模糊的錯誤。如果您發現自己處於需要同時使用equals
和compareTo
(或compare
)的情況下,請記錄該情況並與其使用情況保持一致。
不,因爲兩個對象的比較只能確定一個大於,等於或小於另一個。通常從比較器返回的結果是(-1,0,1)之一。例如:
comparator.compare(1,5) == -1
comparator.compare(1,3) == -1
comparator.compare(3,1) == 1
comparator.compare(5,3) == 1
comparator.compare(3,3) == 0
這使開發人員在對象之間比較容易得多。如果合同要求返回差異的規模,那麼對於例如字符串實施這種方法將是非常困難的。爲了獲得精確的數值差異,必須讀取兩個字符串的全部內容,這對性能可能非常不利,特別是如果每個字符串都非常大。由於只需確定哪一個比另一個大,因此通常只需要比較一小部分字符串以確定哪一個比另一個「大」。整個字符串唯一需要處理的時間就是它們實際上是否相等。這個性能問題也是爲什麼在可能的情況下優先使用散列的原因