前言:排序是编程中经常需要用到的功能,通常我们可以通过对我们的查询SQL进行排序。在 Java 的工具类 Collections 中也提供了 sort() 方法用于实现对列表等集合中元素的排序。
Collections.sort() 方法有两种形式:Collections.sort(List) 和 Collections.sort(List, Comparator)。



1. 实现 Comparable 接口
public interface Comparable<T> {
 
    public int compareTo(T o);
 
}


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

接口中通过x.compareTo(y) 来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。

直接上代码

public class User implements Comparable<User> {
    private String name;
    private int age;
 
    public User() {
    }
 
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
 
    @Override
    public int compareTo(User user) {
       return age - user.getAge();
    }
}

public class JavaBase {
    public static void main(String[] args) {
        User user1 = new User("Jackie", 25);
        User user2 = new User("Jim", 18);
        User user3 = new User("Lucy", 30);
        User user4 = new User("Kate", 18);
 
 
        List<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        users.add(user3);
        users.add(user4);
 
        System.out.println("排序前" );
        for (User user : users) {
            System.out.println(user.getName() + " " + user);
        }
 
        // ================对集合进行排序==================
        Collections.sort(users);

        System.out.println("排序后" );
        for (User user : users) {
            System.out.println(user.getName() + " " + user);
        }
    }
}


2. 实现 Comparator 接口
public interface Comparator<T> {
 
    int compare(T o1, T o2);
 
    boolean equals(Object obj);
 
}

接口中通过x.compare(y) 来比较x和y的大小。若返回负数,意味着x比y小;返回零,意味着x等于y;返回正数,意味着x大于y。

直接上代码

public class User {
    private String name;
    private int age;
 
    public User() {
    }
 
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
 
    @Override
    public int compareTo(User user) {
       return age - user.getAge();
    }
}

public class UserComparator implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        User user1 = (User) o1;
        User user2 = (User) o2;
 
        if (user1.getAge() > user2.getAge()) {
            return 1;
        } else if (user1.getAge() < user2.getAge()) {
            return -1;
        } else {
            //利用String自身的排序方法。
            //如果年龄相同就按名字进行排序
            return user1.getName().compareTo(user2.getName());
        }
    }
}

public class JavaBase {
    public static void main(String[] args) {
        User user1 = new User("Jackie", 25);
        User user2 = new User("Jim", 18);
        User user3 = new User("Lucy", 30);
        User user4 = new User("Kate", 18);
 
 
        List<User> users = new ArrayList<>();
        users.add(user1);
        users.add(user2);
        users.add(user3);
        users.add(user4);
 
        System.out.println("排序前" );
        for (User user : users) {
            System.out.println(user.getName() + " " + user);
        }
 
        // ================对集合进行排序==================
        Collections.sort(users,new UserComparator());

        System.out.println("排序后" );
        for (User user : users) {
            System.out.println(user.getName() + " " + user);
        }
    }
}


3. 二者区别

Comparable和Comparator都是用来实现集合中元素的比较、排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以想要实现排序,就需要在集合外定义Comparator接口或在集合内实现Comparable接口两种方法。
可以说一个是自已完成比较,一个是外部程序(自定义比较规则)实现比较的差别而已。
方式一相对来说耦合度比较高,不优雅。