定义比较

Comparable vs. Comparator

java.lang.Comparable java.util.Comparator
类型 接口 接口
使用时机 定义类时实现 类定义完成后,重新定义比较器
功能 实现类的 自然序 可定义多种比较方式
覆盖方法 public int compareTo(T o) public int compare(T o1, T o2)
实现次数 只能实现一次(类定义时) 可定义多个比较器类

Comparable

接口 java.lang.Comparable 在类定义的时候实现,可用于设定对象的默认排序(自然序),需要覆写public int compareTo(T o)方法。

import java.lang.Comparable;
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

public class Person implements Comparable<Person> {
    String name;
    int age;
    public Person(String name, int age){
        super();
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString(){
        return "Person < " + this.name + " , " + this.age +" >";
    }
    
    @Override
    public int compareTo(Person other){
        return name.compareTo(other.name);
    }

    public static void main(String[] args){
        List<Person> list = new ArrayList<>();
        Person p1 = new Person("Tom", 12);
        Person p2 = new Person("Tim", 34);
        Person p3 = new Person("Sally", 15);
        list.add(p1);
        list.add(p2);
        list.add(p3);

        System.out.println("java.lang.Comparable --------------");
        Collections.sort(list);
        for(Person elem: list){
            System.out.println(elem);
        }
    }
}

例如,运行上面的代码输出:

java.lang.Comparable --------------
Person < Sally , 15 >
Person < Tim , 34 >
Person < Tom , 12 >

Comparator

接口 java.util.Comparator 通常用于无法修改类定义的代码,而为该类实现一个或多个比较器,需要重新定义一个比较器类并覆写 public int compare(T o1, To2) 方法。

class PersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2){
        return Integer.compare(p1.age, p2.age);
    }
}

...

// using Comparator
    System.out.println("java.util.Comparator ==============");
    Collections.sort(list, new PersonComparator());

    for(Person elem: list){
        System.out.println(elem);
    }

定义该比较器后重新比较,可得

java.util.Comparator ==============
Person < Tom , 12 >
Person < Sally , 15 >
Person < Tim , 34 >
// using Comparator
    System.out.println("java.util.Comparator2 ==============");
    Collections.sort(list, new Comparator<Person>(){
        @Override
        public int compare(Person p1, Person p2){
            return p2.age - p1.age;
        }
    });
    for(Person elem: list){
        System.out.println(elem);
    }

定义该匿名比较器后重新比较,可得

java.util.Comparator2 ==============
Person < Tim , 34 >
Person < Sally , 15 >
Person < Tom , 12 >