温馨提示×

温馨提示×

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

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

Java 比较器怎么实现

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

在 Java 中,**比较器(Comparator)**主要用于对对象进行排序,常见有两种方式:


一、实现 Comparator 接口(推荐,解耦)

Comparator 位于 java.util.Comparator不要求修改原类

1️⃣ 基本用法

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 后面

2️⃣ 使用 Lambda(Java 8+,最常用 ✅)

Collections.sort(list, (p1, p2) -> p1.age - p2.age);

或更简洁:

list.sort((p1, p2) -> p1.age - p2.age);

3️⃣ 使用 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 处理),可以直接告诉我,我给你写完整示例。

向AI问一下细节

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

AI