在深入了解TreeMap之前,有兩個接口要先弄清楚,分別是Comparable和Comparator
Comparable & Comparator
Comparable
Comparable 此接口強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作)。
它只有一個方法,int compareTo(T o),用來比較當前對象和傳入的參數,查看jdk api,共有這一批類實現了此接口,見下圖
打開實現了該接口的Integer包裝類查看源碼
public final class Integer extends Number implements Comparable<Integer> {

public int compareTo(Integer anotherInteger) {
int thisVal = this.value;
int anotherVal = anotherInteger.value;
return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
}
可以看到該方法通過當前的Integer對象的值是否大于傳入的參數來得到返回值,Integer的compareTo實現是按數字大小的自然排序,再找另一個例子String
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
public int compareTo(String anotherString) {
int len1 = count;
int len2 = anotherString.count;
int n = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
if (i == j) {
int k = i;
int lim = n + i;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
} else {
while (n-- != 0) {
char c1 = v1[i++];
char c2 = v2[j++];
if (c1 != c2) {
return c1 - c2;
}
}
}
return len1 - len2;
}
可以看出String的compareTo實現是按字符串中字符的Unicode值進行排序的,也真是因為各種類實現的不同,所以只有在相互可比的類才能進行排序,否則會拋出java.lang.ClassCastException的異常。應該說Comparable是集合內部實現的排序,想要進行集合外的排序就需要Comparator接口。
Comparator
如果一個類不能實現Comparable接口,那么我們自己可以提供Comparator的排序,如果你不喜歡缺省的Comparator行為,照樣可以編寫自己的Comparator。
Comparator只有2個方法,分別為int compare(T o1, T o2) 和boolean equals(Object obj)
Comparator的compare方法的返回值和Comparable的compareTo返回值基本相似,如果排序第一個元素出現在第二個元素之前,則返回一個負值,如果第一個元素出現在第二個元素后面,返回一個正值,再否則,返回零。與Comparable不同的是Comparator是由用戶自行決定處理。
通過一個小例子可以比較明確的看出
class ComparatorTest implements Comparator{
public int compare(Object u1, Object u2) {
String uname1 = ((User)u1).getName();
String uname2 = ((User)u2).getName();
return uname1.compareTo(uname2);
}
}
class User {
private String name;
public String getName(){
return this.name;
}
}
Comparator比較函數強行對某些對象 collection 進行整體排序。可以將 Comparator 傳遞給 sort 方法(如 Collections.sort),從而允許在排序順序上實現精確控制。還可以使用 Comparator 來控制某些數據結構(如 TreeSet 或 TreeMap)的順序。