Comparable 和 Comparator 比较

272 阅读1分钟

本文简单介绍Comparable 和Comparator两个接口,并且说明通过stream流来进行排序比较。

1、Comparable

1.1、定义

Comparable定义为一个接口,如下:

package java.lang;
import java.util.*;

public interface Comparable<T> {
    public int compareTo(T o);
}

入参为要对比的对象,若为空则会报空指针异常。返回值为int,当前对象大于、等于、小于对比对象时分别返回正数、零、负数。

1.2、实例

若一个类实现了Comparable接口,就意味着“该类支持排序”。

例如:Date

public class Date implements java.io.Serializable, Cloneable, Comparable<Date>{
    ...
    public int compareTo(Date anotherDate) {
        long thisTime = getMillisOf(this);
        long anotherTime = getMillisOf(anotherDate);
        return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1));
    }
    ...
}

我们平时使用时,主要有两种用法:比较两个时间的大小和对时间排序。

代码如下:

public static void main(String[] args) {
        //1、比较两个时间的大小
        Date now = new Date();
        Date before = new Date(now.getTime()-100000);
        System.out.println(now.compareTo(before));
​
        //2、对时间排序
        ArrayList<Date> dates = new ArrayList<>();
        Random random = new Random();
        for (int i = 0;i<10;i++){
            dates.add(new Date(now.getTime()-random.nextInt(10) * 10000));
        }
        Collections.sort(dates);
        System.out.println(dates);
    }

打印的结果可以如下

1
[Thu Nov 04 19:53:52 CST 2021, 
Thu Nov 04 19:54:02 CST 2021, 
Thu Nov 04 19:54:02 CST 2021,
Thu Nov 04 19:54:22 CST 2021, 
Thu Nov 04 19:54:32 CST 2021,
Thu Nov 04 19:54:32 CST 2021,
Thu Nov 04 19:54:52 CST 2021, 
Thu Nov 04 19:55:22 CST 2021, 
Thu Nov 04 19:55:22 CST 2021, 
Thu Nov 04 19:55:22 CST 2021]

2、Comparator

2.1、定义

Comparator 是比较器接口。定义如下:

package java.util;
​
public interface Comparator<T> {
​
    int compare(T o1, T o2);
​
    boolean equals(Object obj);
}

int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

Comparator 与 Comparable 相比就像是电磁炉与热水壶的区别,电磁炉用于给其他容器加热,更加灵活。热水壶在设计时就已经固定了结构,给自身内的水进行加热。

2.2、实例

我们定义了一个比较器 AscAgeComparator ,来分别对Person进行 升序 排序。

private static class AscAgeComparator implements Comparator<Person> {
​
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
}

3、Stream

我们用stream流处理集合,同样stream也可以对集合排序。

public static void main(String[] args) {
    Date now = new Date();
    //2、对时间排序
    ArrayList<Date> dates = new ArrayList<>();
    Random random = new Random();
    for (int i = 0;i<10;i++){
        dates.add(new Date(now.getTime()-random.nextInt(10) * 10000));
    }
    List<Date> collectDates = dates.stream().sorted((a, b) -> (int) (a.getTime() - b.getTime())).collect(Collectors.toList());
    System.out.println(collectDates);
}

sorted方法的入参就是一个Comparator比较器,这样写代码更加简洁易懂,推荐这样的写法

\