温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java Comparator 怎么用

发布时间:2026-07-18 11:42:23 来源:亿速云 阅读:96 作者:小樊 栏目:编程语言

在 Java 里,Comparator 是用来定义对象排序规则的一个接口,通常配合 Collections.sort()List.sort()Arrays.sort()TreeSet / TreeMap 使用。

下面从最常见用法到进阶用法一步步说明。


一、Comparator 是什么?

Comparator 位于 java.util 包,用来自定义比较规则,不要求对象本身实现 Comparable

核心方法是:

int compare(T o1, T o2)

返回值含义:

返回值 含义
< 0 o1 小于 o2
= 0 o1 等于 o2
> 0 o1 大于 o2

二、最基础用法(匿名内部类)

示例:按年龄排序

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
import java.util.*;

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", 22));

        Collections.sort(list, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.age - o2.age; // 升序
            }
        });

        for (Person p : list) {
            System.out.println(p.name + " " + p.age);
        }
    }
}

输出:

Bob 18
Alice 20
Tom 22

三、Lambda 表达式(推荐)

Java 8 以后可以用 Lambda 简化:

list.sort((o1, o2) -> o1.age - o2.age);

或更简洁:

list.sort(Comparator.comparingInt(o -> o.age));

四、Comparator 常用静态方法(非常重要)

1️⃣ 按一个字段排序

Comparator<Person> byAge = Comparator.comparingInt(p -> p.age);
list.sort(byAge);

2️⃣ 倒序排序

list.sort(Comparator.comparingInt(Person::getAge).reversed());

3️⃣ 多条件排序(先年龄,再姓名)

list.sort(
    Comparator.comparingInt(Person::getAge)
              .thenComparing(Person::getName)
);

4️⃣ 处理 null 值

Comparator<Person> comparator =
    Comparator.nullsFirst(Comparator.comparing(Person::getName));

五、与 Comparable 的区别

对比项 Comparable Comparator
java.lang java.util
方法 compareTo compare
是否修改原类 ✅ 需要 ❌ 不需要
排序规则 默认排序 自定义多种排序

一般建议

  • 类本身有“自然顺序” → 用 Comparable
  • 需要多种排序方式 → 用 Comparator

六、TreeSet / TreeMap 中使用 Comparator

TreeSet<Person> set = new TreeSet<>(
    Comparator.comparingInt(Person::getAge)
);

七、完整示例(推荐写法)

list.sort(
    Comparator.comparing(Person::getAge)
              .thenComparing(Person::getName)
              .reversed()
);

如果你愿意,我可以:

  • 面试题角度讲 Comparator
  • 对比 compareTo vs compare 的坑
  • 给你 真实业务排序案例

你想看哪种?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI