Comparable 與 Comparator 皆用於實現集合排序,核心差異在於:
compareTo 方法,定義「自然順序」(如 String、Integer 已內建比較邏輯)。compare 方法,不修改被比較物件類別,實現策略模式。| 特性 | Comparable | Comparator |
|---|---|---|
| 實作位置 | 類別內部 | 外部獨立類別 |
| 方法簽名 | int compareTo(T o) | int compare(T o1, T o2) |
| 適用場景 | 單一自然順序 | 多種排序策略、無法修改原類別 |
| 設計模式 | — | 策略模式 |
Integer 預設自然順序為數值大小,若需依絕對值排序,不可修改 Integer 類別,需撰寫 Comparator:
// AbsComparator.java
import java.util.*;
public class AbsComparator implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
int v1 = Math.abs(o1);
int v2 = Math.abs(o2);
return Integer.compare(v1, v2); // Java 7+ 推薦寫法
}
}
// Test.java
import java.util.*;
public class Test {
public static void main(String[] args) {
Random rnd = new Random();
Integer[] integers = new Integer[20];
for (int i = 0; i < integers.length; i++) {
integers[i] = rnd.nextInt(100) * (rnd.nextBoolean() ? 1 : -1);
}
System.out.println("Integer 自然順序排序:");
Arrays.sort(integers);
System.out.println(Arrays.asList(integers));
System.out.println("依絕對值排序:");
Arrays.sort(integers, new AbsComparator());
System.out.println(Arrays.asList(integers));
}
}
掌握兩者差異與適用時機,能靈活應對各類排序需求,編寫更彈性、可維護的程式碼。