| Comparable<T> | Comparator<T> | |
|---|---|---|
| Đặt ở | Bên trong class T | Bên ngoài, class riêng/lambda |
| Method | int compareTo(T o) | int compare(T a, T b) |
| Số thứ tự | Một (natural ordering) | Nhiều strategy |
// Comparable — thứ tự tự nhiên trong class
class User implements Comparable<User> {
int age;
public int compareTo(User other) { return Integer.compare(this.age, other.age); }
}
Collections.sort(users); // dùng compareTo
// Comparator — strategy linh hoạt bên ngoài
users.sort(Comparator.comparing(User::getName));
users.sort(Comparator.comparingInt(User::getAge).thenComparing(User::getName));
users.sort(Comparator.comparing(User::getName).reversed());Return value: âm = this đứng trước, 0 = bằng, dương = đứng sau.
Bẫy thường gặp:
- Đừng dùng a - b cho int — overflow với số âm lớn. Dùng Integer.compare(a, b).
- compareTo phải nhất quán với equals, không thì TreeSet/TreeMap cư xử bất ngờ.
Chọn: Comparable cho class của bạn + thứ tự "đúng đắn duy nhất" (vd LocalDate). Comparator cho class bên thứ 3 hoặc cần nhiều cách sort.
| Comparable<T> | Comparator<T> | |
|---|---|---|
| Lives | Inside class T | Outside, separate class/lambda |
| Method | int compareTo(T o) | int compare(T a, T b) |
| # orderings | One (natural) | Many strategies |
// Comparable — natural order inside the class
class User implements Comparable<User> {
int age;
public int compareTo(User other) { return Integer.compare(this.age, other.age); }
}
Collections.sort(users); // uses compareTo
// Comparator — flexible external strategies
users.sort(Comparator.comparing(User::getName));
users.sort(Comparator.comparingInt(User::getAge).thenComparing(User::getName));
users.sort(Comparator.comparing(User::getName).reversed());Return value: negative = this first, 0 = equal, positive = later.
Common pitfalls:
- Do not use a - b for ints — overflows on large negatives. Use Integer.compare(a, b).
- compareTo must be consistent with equals, otherwise TreeSet/TreeMap misbehave.
Choose: Comparable for your own class with a single obvious order (e.g. LocalDate). Comparator for third-party classes or multiple sort orders.