验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

Java Comparator 怎么用

阅读:673 来源:乙速云 作者:代码code

Java Comparator 怎么用

在 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 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() {
            @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 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 comparator =
    Comparator.nullsFirst(Comparator.comparing(Person::getName));

五、与 Comparable 的区别

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

一般建议

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

六、TreeSet / TreeMap 中使用 Comparator

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

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

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

如果你愿意,我可以:

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

你想看哪种?

分享到:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>