在 Java 中,**比较器(Comparator)**主要用于对对象进行排序,常见有两种方式:
Comparator 接口(推荐,解耦)Comparator 位于 java.util.Comparator,不要求修改原类。
import java.util.*;
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("Alice", 20));
list.add(new Person("Bob", 18));
list.add(new Person("Tom", 25));
// 按年龄升序排序
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.age - o2.age; // 升序
}
});
System.out.println(list);
}
}
✅ 返回值规则:
< 0:o1 排在 o2 前面= 0:相等> 0:o1 排在 o2 后面Collections.sort(list, (p1, p2) -> p1.age - p2.age);
或更简洁:
list.sort((p1, p2) -> p1.age - p2.age);
Comparator 工具方法(推荐 ✅✅)import java.util.Comparator;
list.sort(Comparator.comparingInt(Person::getAge));
多条件排序:
list.sort(
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName)
);
Comparable 接口(自然排序)Comparable 位于 java.lang.Comparable,侵入式。
class Person implements Comparable<Person> {
String name;
int age;
@Override
public int compareTo(Person o) {
return this.age - o.age;
}
}
使用:
Collections.sort(list);
⚠️ 缺点:只能有一种默认排序规则。
Comparator.comparingInt(Person::getAge)
Comparator.comparingInt(Person::getAge).reversed()
Comparator vs Comparable| 对比项 | Comparator | Comparable |
|---|---|---|
| 包 | java.util | java.lang |
| 是否改原类 | ❌ 不改 | ✅ 要改 |
| 排序规则 | 多个 | 只能一个 |
| 使用场景 | 灵活排序 | 自然顺序 |
❌ 不要用减法比较整数(可能溢出):
return o1.age - o2.age; // 不推荐
✅ 推荐:
return Integer.compare(o1.age, o2.age);
如果你有具体排序需求(比如 Map、对象多个字段、中文排序、null 处理),可以直接告诉我,我给你写完整示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。