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)}。
上面是jdk的原話!
我寫了下面的程序:
import java.util.HashSet;
import java.util.Set;
public class Test1 implements Comparable<Test1> {
public static void main(String args[]) {
Test1 t1 = new Test1();
Test1 t2 = new Test1();
Set<Test1> set = new HashSet<Test1>();
set.add(t1);
set.add(t2);
System.out.println(set);
}
@Override
public boolean equals(Object o) {
return false;
}
@Override
public int hashCode() {
return 100;
}
public int compareTo(Test1 o2) {
return 0;
}
}
按jdk的原話:加粗的地方
例如,如果將兩個鍵 a 和 b 添加到沒有使用顯式比較器的有序集合中,使 (!a.equals(b) && a.compareTo(b) == 0),那麼第二個 add 操作將返回 false(有序集合的大小沒有增加),因爲從有序集合的角度來看,a 和 b 是相等的。
我這個程序滿足這個條件,怎麼set的size還是2呢?
麻煩閱讀者來解釋一下吧!謝謝了!