相同点
这两个接口都是用来排序的,例如数组的方法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;
}
/**
* @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) {
return o1.getNumber()-o2.getNumber();
}
});
System.out.println("排序后");
normals.forEach(e-> System.out.println(e.getNumber()));
}
上面那个也可以用Lambda表达式写
Collections.sort(normals,((o1, o2) -> o1.getNumber()-o2.getNumber()));
如果你对Lambda表达式有疑问的话,可以参考我的Lambda教程