集合排序Comparable和Comparator有什麼區別?

Comparable和Comparator兄弟倆長得是真像。但是,需要注意下,使用中它們還是有不少區別的。下面,就一探究竟吧。

一、Comparator

做過集合排序的童鞋應該知道,可以使用Collections.sort方法對集合進行排序。我們點進去Collections類源碼裏邊,會發現sort有兩個重載方法。一個只需傳一個List參數,另一個需要傳兩個參數:List和Comparator。

其實,這兩種方法就對應了Comparable和Comparator的兩種用法。我經常使用帶兩個參數的方法,即需要實現Comparator接口。

使用步驟:

  1. 定義待比較的實體類。
  2. 定義一個比較器,實現Comparator接口。
  3. 重寫compare方法。
//待比較的實體類
public class User{
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public User() {

    }
}
//比較器,實現Comparator接口
public class UserCompare implements Comparator<User> {
    @Override
    public int compare(User o1, User o2) {
        return o1.getAge() - o2.getAge();
    }
}

public class CmpTest {
    public static void main(String[] args) {

        User user1 = new User(20, "李四");
        User user2 = new User(18, "張三");
        User user3 = new User(23, "王五");

        ArrayList<User> userList = new ArrayList<>();
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);

        System.out.println("排序前");
        for (User user : userList) {
            System.out.println(user.getAge() ":" user.getName());
        }
        Collections.sort(userList, new UserCompare()); //把比較器傳進去
        System.out.println("排序後");
        for (User user : userList) {
            System.out.println(user.getAge() ":" user.getName());
        }
    }
}

打印結果如下:

排序前
20:李四
18:張三
23:王五
排序後
18:張三
20:李四
23:王五

可以看到,已經實現了集合中User對象按年齡升序排序。

二、Comparable

這種方式,需要修改User類,實現Comparable接口,然後重寫compareTo方法。

public class User implements Comparable<User>{
    private int age;
    private String name;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public User(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public User() {

    }

    @Override
    public int compareTo(User o) {
        return this.getAge() - o.getAge();
    }
}

測試類中只需要修改一行代碼

//原來的代碼
Collections.sort(userList, new UserCompare()); 
//替換爲
Collections.sort(userList);

測試結果和上面是一模一樣的。

三、總結

  1. 它們出自不同的包,Comparator在 java.util 包下,Comparable在 java.lang 包下。
  2. Comparator 使用比較靈活,不需要修改實體類源碼,但是需要實現一個比較器。
  3. Comparable 使用簡單,但是對代碼有侵入性,需要修改實體類源碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章