三種排序 API 對照
| 方法 | 適用集合 | 物件需實作 | 比較器位置 |
Collections.sort(List, Comparator) | List | 無 | 外部 Comparator |
Arrays.sort(Object[]) | 陣列 | Comparable | 物件內部 compareTo |
Collections.sort(List) | List | Comparable | 物件內部 compareTo |
完整可執行範例
import java.util.*;
public class ObjectSortDemo {
public static void main(String[] args) {
// 測試資料
Person[] people = {
new Person("P0", 0), new Person("P1", 3), new Person("P2", 5),
new Person("P3", 4), new Person("P4", 8), new Person("P5", 6),
new Person("P6", 7), new Person("P7", 1), new Person("P8", 2),
new Person("P9", 9)
};
// 方式 1:Collections.sort + Comparator(外部比較策略)
List list1 = new ArrayList<>(Arrays.asList(people));
System.out.print("原始順序:");
list1.forEach(p -> System.out.print(p.getAge()));
long t1 = System.currentTimeMillis();
Collections.sort(list1, new AgeComparator());
System.out.println("\n方式1 耗時:" + (System.currentTimeMillis() - t1) + "ms");
list1.forEach(p -> System.out.print(p.getAge()));
// 方式 2:Arrays.sort + Comparable(陣列原地排序)
Person[] arr2 = Arrays.copyOf(people, people.length);
System.out.print("\n\n方式2 陣列排序:");
long t2 = System.currentTimeMillis();
Arrays.sort(arr2);
System.out.println("耗時:" + (System.currentTimeMillis() - t2) + "ms");
for (Person p : arr2) System.out.print(p.getAge());
// 方式 3:Collections.sort(List) + Comparable
List list3 = new ArrayList<>(Arrays.asList(Arrays.copyOf(people, people.length)));
System.out.print("\n\n方式3 List排序:");
long t3 = System.currentTimeMillis();
Collections.sort(list3);
System.out.println("耗時:" + (System.currentTimeMillis() - t3) + "ms");
list3.forEach(p -> System.out.print(p.getAge()));
}
}
// 外部比較器
class AgeComparator implements Comparator {
public int compare(Person p1, Person p2) {
return Integer.compare(p1.getAge(), p2.getAge());
}
}
// 可比較物件(內建自然順序)
class Person implements Comparable {
private String name; private int age;
public Person(String name, int age) { this.name = name; this.age = age; }
public String getName() { return name; }
public int getAge() { return age; }
@Override public int compareTo(Person o) {
return Integer.compare(this.age, o.age);
}
}
選擇指南
- 需多種排序規則(如按年齡、姓名、薪資):用
Comparator 實作不同策略,搭配 Collections.sort(list, comparator)。
- 單一自然順序(如 ID、年齡為主鍵):實作
Comparable,直接用 Collections.sort(list) 或 Arrays.sort(array)。
- 效能考量:陣列排序(
Arrays.sort)略快於 List 轉陣列再排;Comparable 避免額外物件建立,微幅優於 Comparator。
- Java 8+ 最佳實務:
list.sort(Comparator.comparing(Person::getAge)) 或 list.sort(Comparator.comparingInt(Person::getAge)),Lambda 簡潔且無裝箱開銷。