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

    关注我们

Java 比较器怎么实现

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

Java 比较器怎么实现

在 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 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() {
            @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 {
    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 处理),可以直接告诉我,我给你写完整示例。

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