|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
T
- 可以與此物件進行比較的那些物件的型別public interface Comparable<T>
此介面強行對實作它的每個類別的物件進行整體排序。這種排序被稱為類別的自然排序,類別的 compareTo 方法被稱為它的自然比較方法。
實作此介面的物件列表(和陣列)可以通過 Collections.sort
(和 Arrays.sort
)進行自動排序。實作此介面的物件可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。
對於類別 C 的每一個 e1 和 e2 來說,當且僅當 e1.compareTo(e2) == 0 與 e1.equals(e2) 具有相同的 boolean 值時,類別 C 的自然排序才叫做與 equals 一致。注意,null 不是任何類別的實例,即使 e.equals(null) 返回 false,e.compareTo(null) 也將拋出 NullPointerException。
建議(雖然不是必需的)最好使自然排序與 equals 一致。這是因為在使用自然排序與 equals 不一致的元素(或鍵)時,沒有顯式比較器的有序集合(和有序映射表)行為表現「怪異」。尤其是,這樣的有序集合(或有序映射表)違背了根據 equals 方法定義的集合(或映射表)的常規協定。
例如,如果將兩個鍵 a 和 b 添加到沒有使用顯式比較器的有序集合中,使 (!a.equals(b) && a.compareTo(b) == 0),那麼第二個 add 操作將返回 false(有序集合的大小沒有增加),因為從有序集合的角度來看,a 和 b 是相等的。
實際上,所有實作 Comparable 的 Java 核心類別都具有與 equals 一致的自然排序。java.math.BigDecimal 是個例外,它的自然排序將值相等但精確度不同的 BigDecimal 物件(比如 4.0 和 4.00)視為相等。
從數學上講,定義給定類別 C 上自然排序的關係式 如下:
{(x, y)|x.compareTo(y) <= 0}。整體排序的商 是:
{(x, y)|x.compareTo(y) == 0}。它直接遵循 compareTo 的協定,商是 C 的等價關係,自然排序是 C 的整體排序。當說到類別的自然排序與 equals 一致 時,是指自然排序的商是由類別的
equals(Object)
方法定義的等價關係。{(x, y)|x.equals(y)}。
此介面是 Java Collections Framework 的成員。
Comparator
方法摘要 | |
---|---|
int |
compareTo(T o)
比較此物件與指定物件的順序。 |
方法詳細資訊 |
---|
int compareTo(T o)
實作類別必須確保對於所有的 x 和 y 都存在 sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) 的關係。(這意味著如果 y.compareTo(x) 拋出一個異常,則 x.compareTo(y) 也要拋出一個異常。)
實作類別還必須確保關係是可傳遞的:(x.compareTo(y)>0 && y.compareTo(z)>0) 意味著 x.compareTo(z)>0。
最後,實作者必須確保 x.compareTo(y)==0 意味著對於所有的 z,都存在 sgn(x.compareTo(z)) == sgn(y.compareTo(z))。 強烈推薦 (x.compareTo(y)==0) == (x.equals(y)) 這種做法,但並不是 嚴格要求這樣做。一般來說,任何實作 Comparable 介面和違背此條件的類別都應該清楚地指出這一事實。推薦如此闡述:「注意:此類別具有與 equals 不一致的自然排序。」
在前面的描述中,符號 sgn(expression) 指定 signum 數學函數,該函數根據 expression 的值是負數、零還是正數,分別返回 -1、0 或 1 中的一個值。
o
- 要比較的物件。
ClassCastException
- 如果指定物件的型別不允許它與此物件進行比較。
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。