网站公告

本次更新:没啥更新的

“钱塘江上潮信起,今日方知我是我”

Skip to content

Comparable 和 Comparator ​

字数: 0 字 时长: 0 分钟

Comparable 和 Comparator 是 Java 中用于比较对象的两个接口。

从名字上也能看出来,它们的作用比较相似:

按照一定的规则比较两个对象。

1. Comparable ​

Comparable 接口的定义非常简单:

java
public interface Comparable<T> {

    int compareTo(T o);
}

如果一个类实现了 Comparable 接口,就可以通过重写:

java
compareTo()

定义该类对象之间的比较规则。

例如:

java
public class Kerwim
        implements Comparable<Kerwim> {

    private int age;

    private String name;

    public Kerwim(
            int age,
            String name) {

        this.age =
                age;

        this.name =
                name;
    }

    @Override
    public int compareTo(
            Kerwim o) {

        return this.getAge()
                - o.getAge();
    }

    public static void main(
            String[] args) {

        Kerwim kerwim1 =
                new Kerwim(
                        19,
                        "kerwim"
                );

        Kerwim kerwim2 =
                new Kerwim(
                        16,
                        "克尔温"
                );

        if (
                kerwim1.compareTo(
                        kerwim2
                ) < 0
        ) {

            System.out.println(
                    kerwim1.getName()
                            + "比较年轻有为"
            );

        } else {

            System.out.println(
                    kerwim2.getName()
                            + "比较年轻有为"
            );
        }
    }
}

在上面的示例中,创建了一个 Kerwim 类,它有两个字段:

text
age

name

Kerwim 实现了:

java
Comparable<Kerwim>

并重写:

java
compareTo()

程序输出:

text
克尔温比较年轻有为

因为:

text
16 < 19

真正决定比较规则的就是:

java
compareTo()

它的返回值可能为:

text
负数

0

正数

分别表示:

text
当前对象 < 被比较对象
    ↓
返回负数


当前对象 == 被比较对象
    ↓
返回 0


当前对象 > 被比较对象
    ↓
返回正数

也就是:

text
compareTo() < 0
    ↓
当前对象更小


compareTo() == 0
    ↓
两个对象在当前排序规则下相等


compareTo() > 0
    ↓
当前对象更大

如果两个对象本身不能按照当前规则进行比较,就可能出现:

text
ClassCastException

不过有了泛型以后,这类类型不匹配的问题通常可以更早在编译阶段发现。

2. Comparator ​

Comparator 和 Comparable 的作用相似,不过定义和使用方式有所不同。

核心定义:

java
public interface Comparator<T> {

    int compare(
            T o1,
            T o2
    );

    boolean equals(
            Object obj
    );
}

其中最核心的方法是:

java
compare(
        T o1,
        T o2
)

返回值同样可能是:

text
负数

0

正数

分别表示:

text
o1 < o2
    ↓
返回负数


o1 == o2
    ↓
返回 0


o1 > o2
    ↓
返回正数

也就是:

text
compare(o1, o2) < 0
    ↓
o1 更小


compare(o1, o2) == 0
    ↓
两者在当前比较规则下相等


compare(o1, o2) > 0
    ↓
o1 更大

Comparator 中还声明了:

java
equals(
        Object obj
)

用于判断两个 Comparator 在比较规则上是否相等。

不过实际使用 Comparator 时,我们最主要关注的还是:

java
compare()

有时候,我们并不想修改原来的类,也不想让这个类主动实现:

java
Comparable

但又需要对这些对象进行比较。

这时候:

text
Comparator

就派上用场了。

Noctiflorous Garden · MIT License