#相同點
這兩個接口都是用來排序的,例如數組的方法Arrays.sort(),對集合進行排序的方法Collections.sort() 。
#不同點
Comparable接口是用來給實作這個接口的類,自己排序,重點是給自己 。
Comparator接口是用來給其他類對象進行排序的,重點是給他人 。
#Comparable例子
首先定義一個類實作了Comparable接口 ,類名叫Comparable_Example
package Sort;
public class Comparable_Example implements Comparable<Comparable_Example> {
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
private int number;
public Comparable_Example(int number) {
this.number=number;
}
//按照古典類型排序
//傳回正數 ,右邊在上,左邊在下
//傳回0 相等
//傳回負數 ,右邊在下 ,左邊在上
/**
* @param o 就代表在排序時候,本身類的其他執行個體,将自身與其他執行個體進行比較
* @return 傳回正實數就是大于,0代表等于,負實數代表小于
*/
@Override
public int compareTo(Comparable_Example o) {
return this.number-o.getNumber();
}
}
再定義一個沒有實作接口的普通類Normal
package Sort;
public class Normal {
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
private int number;
public Normal(int number) {
this.number = number;
}
}
接着在主函數裡面建立數組,并添加資料,
首先用數組Arrays.sort()方法排序
//首先是數組排序
Comparable_Example[] comparable_examples=new Comparable_Example[10];
//随機數 随機生成0到100的int值
Random random=new Random();
for (int i = 0; i <10 ; i++) {
comparable_examples[i]=new Comparable_Example(random.nextInt(100));
}
//未排序前
for (int i = 0; i <comparable_examples.length ; i++) {
System.out.println(comparable_examples[i].getNumber());
}
System.out.println("排序後");
Arrays.sort(comparable_examples);
for (int i = 0; i <comparable_examples.length ; i++) {
System.out.println(comparable_examples[i].getNumber());
}
如果你對一個沒有實作Comparable接口的類的數組,或者類的集合,也用Arrays.sort()方法則會抛出異常
Exception in thread "main" java.lang.ClassCastException: Sort.Normal cannot be cast to java.base/java.lang.Comparable
at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
at java.base/java.util.Arrays.sort(Arrays.java:1248)
at Sort.Sort.main(Sort.java:31)
如果是集合則用Collections.sort()方法
List<Comparable_Example> comparable_exampleList=new ArrayList<Comparable_Example>();
//随機數 随機生成0到100的int值
Random random=new Random();
for (int i = 0; i <10 ; i++) {
comparable_exampleList.add(new Comparable_Example(random.nextInt(100)));
}
System.out.println("集合排序後");
Collections.sort(comparable_exampleList);
comparable_exampleList.forEach(e-> System.out.println(e.getNumber()));
}
運作結果
#Comparator接口例子
直接上代碼,對上個例子中的Normal類集合或數組進行排序
List<Normal> normals=new ArrayList<Normal>();
Random random=new Random();
for (int i = 0; i <10 ; i++) {
normals.add(new Normal(random.nextInt(100)));
}
//重點代碼
Collections.sort(normals, new Comparator<Normal>() {
@Override
public int compare(Normal o1, Normal o2) {
//傳回正數 代表第一個參數o1 大于第二個參數o2
//傳回 0 代表兩個參數等于
//傳回負數 代表第一個參數o1 小于第二個參數o2
return o1.getNumber()-o2.getNumber();
}
});
System.out.println("排序後");
normals.forEach(e-> System.out.println(e.getNumber()));
}
上面那個也可以用Lambda表達式寫
如果你對Lambda表達式有疑問的話,可以參考我的Lambda教程
https://blog.csdn.net/a1064072510/article/details/80947286