集合排序Comparable和Comparator有什麼區別?
阿新 • • 發佈:2020-01-06
Comparable和Comparator兄弟倆長得是真像。但是,需要注意下,使用中它們還是有不少區別的。下面,就一探究竟吧。
一、Comparator
做過集合排序的童鞋應該知道,可以使用Collections.sort方法對集合進行排序。我們點進去Collections類原始碼裡邊,會發現sort有兩個過載方法。一個只需傳一個List引數,另一個需要傳兩個引數:List和Comparator。
其實,這兩種方法就對應了Comparable和Comparator的兩種用法。我經常使用帶兩個引數的方法,即需要實現Comparator介面。
使用步驟:
- 定義待比較的實體類。
- 定義一個比較器,實現Comparator介面。
- 重寫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);
測試結果和上面是一模一樣的。
三、總結
- 它們出自不同的包,Comparator在 java.util 包下,Comparable在 java.lang 包下。
- Comparator 使用比較靈活,不需要修改實體類原始碼,但是需要實現一個比較器。
- Comparable 使用簡單,但是對程式碼有侵入性,需要修改實體類原始碼。