2015-02-10 64 views
0

在實現ComparatorComparable接口,是它必須確保:合同和可比

如果

  • 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

回答

1

不一定。

什麼你所描述的是transitive relation三者之間給出的對象,as far asboth of the interfaces,而使用他們必須他們之間傳遞的來講,關係。

這就是說,由於三類ABC是相互之間具有可比性,如果A.compareTo(B) == 0 && B.compareTo(C) == 0,然後A.compareTo(C) == 0Comparator也適用同樣的原則。

你現在正在混淆的是compareToequals之間的區別。雖然這兩個是密切相關的,沒有任何強制執行文檔中提供的very strong recommendation

強烈建議,但並不嚴格要求(x.compareTo(y)==0) == (x.equals(y))。一般而言,任何實現接口並違反此條件的類應清楚地指出這一事實。推薦的語言是「注意:這個類的自然排序與equals不一致」。

這當然是可能的和有效的有一個equals定義與compareTo甚至compare不一致,但根據程序的性質,它可以導致模糊的錯誤。如果您發現自己處於需要同時使用equalscompareTo(或compare)的情況下,請記錄該情況並與其使用情況保持一致。

0

不,因爲兩個對象的比較只能確定一個大於,等於或小於另一個。通常從比較器返回的結果是(-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 

這使開發人員在對象之間比較容易得多。如果合同要求返回差異的規模,那麼對於例如字符串實施這種方法將是非常困難的。爲了獲得精確的數值差異,必須讀取兩個字符串的全部內容,這對性能可能非常不利,特別是如果每​​個字符串都非常大。由於只需確定哪一個比另一個大,因此通常只需要比較一小部分字符串以確定哪一個比另一個「大」。整個字符串唯一需要處理的時間就是它們實際上是否相等。這個性能問題也是爲什麼在可能的情況下優先使用散列的原因