下面的程序是兩個類各自實現了Comparable接口、Comparator接口html
package com.cnblogs.mufasa.Solution; import java.util.Comparator; class Solution1 implements Comparable<Solution1>{ int val; public Solution1(int val){ this.val=val; } @Override public int compareTo(Solution1 o) { return val-o.val; } } class Solution2 implements Comparator<Solution2> { int val; public Solution2(int val){ this.val=val; } @Override public int compare(Solution2 o1, Solution2 o2) { return o1.val-o2.val; } } public class Client{ public static void main(String[] args) { Solution1 sl1=new Solution1(5); Solution1 sl2=new Solution1(1); System.out.println("sl1.compareTo(sl2):"+sl1.compareTo(sl2)); Solution2 sl21=new Solution2(5); Solution2 sl22=new Solution2(1); System.out.println("sl21.compare(sl21,sl22):"+sl21.compare(sl21,sl22)); System.out.println("sl21.compare(sl21,sl22):"+sl21.reversed().compare(sl21,sl22)); } } /* sl1.compareTo(sl2):4 sl21.compare(sl21,sl22):4 sl21.compare(sl21,sl22):-4 */
經過上面的展現程序,咱們能夠發現這兩個接口實現起來都很簡單,而且實現的邏輯都基本同樣。可是差異仍是有的!java
上面是我總結的一些各自的相同點與不一樣點。編程
Comparable實現簡單、功能純粹單一;Comparator實現可簡單可複雜,能夠在進行Collections.sort()以及Arrays.sort()中臨時實現這個接口,而且實現方式還花裏胡哨的【函數式編程、直接比較等等】ide
package com.cnblogs.mufasa.Solution2; import java.util.Arrays; import java.util.Comparator; public class Person implements Comparable<Person> { private String name; private int age; public Person(String name,int age){ this.name=name; this.age=age; } @Override public int compareTo(Person o) {//先按照姓名的字典序排序,再按照年齡的由小到大排序 String ab=name+o.name; String ba=o.name+name; int len=ab.length(); for(int i=0;i<len;i++){ int temp=ab.charAt(i)-'0'-ba.charAt(i); if(temp<0){ return -1; }else if(temp>0){ return 1; } } return age-o.age; } public String getName() { return name; } public int getAge() { return age; } } class Client{ public static void main(String[] args) { Person[] ps=new Person[6]; ps[0]=new Person("Mufasa",22); ps[1]=new Person("Mufasa",18); ps[2]=new Person("Wanyu",24); ps[3]=new Person("Guoyahong",24); ps[4]=new Person("Guoyahong",26); ps[5]=new Person("Admin",26); for(Person p:ps){ System.out.print(p.getName()+","+p.getAge()+"\t"); } System.out.println(); // Arrays.sort(ps);//使用自帶的Comparable能夠直接實現 // Arrays.sort(ps,Comparator.comparing(Person::getName).thenComparing(Person::getAge));//使用Comparator驗證成功 // Arrays.sort(ps,Comparator.comparing(Person::getName).thenComparing(Person::getAge).reversed());//使用Comparator進行反轉reversed,總體反轉 // Arrays.sort(ps,Comparator.comparing(Person::getName).reversed().thenComparing(Person::getAge));//使用Comparator進行反轉reversed,部分反轉1 Arrays.sort(ps,Comparator.comparing(Person::getName).reversed().thenComparing(Person::getAge).reversed());//使用Comparator進行反轉reversed,部分反轉2 // Arrays.sort(ps,(a,b)->{//利用Comparator接口的簡化函數式編程,平時我使用的就是這個簡單易用 // String ab=a.getName()+b.getName(); // String ba=b.getName()+a.getName(); // int len=ab.length(); // for(int i=0;i<len;i++){ // int temp=ab.charAt(i)-'0'-ba.charAt(i); // if(temp<0){ // return -1; // }else if(temp>0){ // return 1; // } // } // return a.getAge()-b.getAge(); // }); for(Person p:ps){ System.out.print(p.getName()+","+p.getAge()+"\t"); } System.out.println(); } }
通常狀況下,咱們默認使用Comparable接口【優先選擇】,主要是由於這種比較方法簡單易實現,而且功能純粹;函數式編程
若是Comparable實現的比較功能,咱們本身不滿意想要臨時更改,那麼花裏胡哨的Comparator就閃亮登場了,這個功能多,而且低耦合度,咱們可使用的時候隨意進行調整,而且還能夠【把多個Comparator鏈在一塊兒】去實現更加複雜的比較邏輯!函數
list.sort(Comparator.comparing(Employee::getSalary).thenComparing(Employee::getName));//多個Comparator連接組合成複雜排序-層級排序
http://www.javashuo.com/article/p-vsitcfnl-bg.htmlthis
https://blog.csdn.net/bitcarmanlee/article/details/73381705spa