Java中的比较类/接口Comparator和Comparable的使用

Comparable & Comparator 都是用来实现集合中元素的比较、排序的  .

1.Comparable 

Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)   

2.Comparator 

Comparator位于包java.util下    而Comparable位于包  java.lang下

只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现排序的接口方法,

Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)   


自定义的类要在加入List<T>容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序,如API所说:
Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
这里的自然顺序就是实现Comparable接口设定的排序方式。

而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。  
可以说Comparable是自已完成比较,Comparator是外部程序实现比较的差别而已。

可参考:

http://ctzlylc.blog.163.com/blog/static/61967136201165981283/

http://my.oschina.net/leoson/blog/131904

http://merrygrass.iteye.com/blog/687597

http://www.aptusource.org/2014/05/object-ordering/

第一种使用Comparator接口  根据Collections.sort重载方法来实现

 1 /**
 2 * 根据order对User排序 */   
 3 public class User {   
 4 //此处无需实现Comparable接口   
 5     private String name;   
 6     private Integer order;   
 7     public String getName() {   
 8          return name;   
 9      }   
10     public void setName(String name) {   
11         this.name = name;   
12      }   
13     public Integer getOrder() {   
14         return order;   
15      }   
16     public void setOrder(Integer order) {   
17        this.order = order;   
18      }   
19 }   
20   

24 public class Test{   
25     public static void main(String[] args) {   
26         User user1 = new User();   
27         user1.setName("a");   
28         user1.setOrder(1);   
29         User user2 = new User();   
30         user2.setName("b");   
31         user2.setOrder(2);   
32         List<User> list = new ArrayList<User>();   
33         list.add(user2);   
34         list.add(user1);   
35         Collections.sort(list,new Comparator<User>(){   
36            public int compare(User user0, User user1) {   
37                return user0.getOrder().compareTo(user1.getOrder());   
38             }   
39         });   
40        for(User u : list){   
41            System.out.println(u.getName());   
42         }   
43      }   
44 }      

第二种使用Comparable接口  list(集合对象)中的对象实现Comparable接口

 1 /**
 2 * 根据order对User排序
 3 */  
 4 public class User implements Comparable<User>{   
 5     private String name;   
 6     private Integer order;   
 7     public String getName() {   
 8         return name;   
 9      }   
10     public void setName(String name) {   
11         this.name = name;   
12      }   
13     public Integer getOrder() {   
14         return order;   
15      }   
16     public void setOrder(Integer order) {   
17         this.order = order;   
18      }   
19     public int compareTo(User arg0) {   
20         return this.getOrder().compareTo(arg0.getOrder());   
21      }   
22 }   
23   
24   
25   
26 public class Test{   
27     public static void main(String[] args) {   
28           User user1 = new User();   
29           user1.setName("a"); user1.setOrder(1);   
30           User user2 = new User(); user2.setName("b");   
31           user2.setOrder(2);   
32           List<User> list = new ArrayList<User>();   
33         //此处add user2再add user1   
34          list.add(user2); list.add(user1);   
35          Collections.sort(list);   
36         for(User u : list){   
37              System.out.println(u.getName());   
38          }   
39      }   
40 }  
原文地址:https://www.cnblogs.com/DreamDrive/p/4284760.html