Comparable接口
首先,我们需要把Comparable接口想象成一个排序器,所谓的排序器就是给对象排序用的,这个应该懂得意思吧。
重点:
1、若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类或列表及数组可以通过Collections.sort或Arrays.sort进行自动排序。
2、实现了Comparable接口的类需要去实现一个方法
public int compareTo(T o);
上述的代码中
没排序的结果是:13----20------5
排序后的结果为:5----13----20
Comparator接口
一般的开发者看这个单词就知道,这是一个比较器,对两个对象进行比较的,
我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序
该接口同样也要重写一个方法:
public int compare(T o1, T o2);
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Text {
class Dog{
public int age;
public String name;
public Dog(int age,String name) {
super();
this.age = age;
this.name = name;
}
@Override
public String toString() {
return this.name+"age:"+age;
}
}
public static void main(String[] args) {
List<Dog> list= new ArrayList<>();
list.add(new Text().new Dog(8, "DogA"));
list.add(new Text().new Dog(6, "DogB"));
list.add(new Text().new Dog(7, "DogC"));
//按年龄排序
Collections.sort(list,new Text().new SortDogAge());
System.out.println("给狗狗按照年龄排序:"+list);
//按姓名排序
Collections.sort(list,new Text().new SortDogName());
System.out.println("给狗狗按名字字母排序:"+list);
}
class SortDogAge implements Comparator<Dog>{
@Override
public int compare(Dog o1, Dog o2) {
return o1.age-o2.age;
}
}
class SortDogName implements Comparator<Dog>{
@Override
public int compare(Dog o1, Dog o2) {
return o1.name.compareTo(o2.name);
}
}
}
结果:
给狗狗按照年龄排序:[DogBage:6, DogCage:7, DogAage:8]
给狗狗按名字字母排序:[DogAage:8, DogBage:6, DogCage:7]
总结
1、Comparator和Comparable最根本的区别就是在于使用,一个是比较一个是排序,其他大的区别并没有什么,
2、我个人通过学习这两个接口,知道了对于方法A中调用了与其他类中方法,只要有别的类也实现了这个方法,那么就可以将这个类的对象通过方法A的参数进入方法A中参与运算,就比方说上面两个案例中的Arrays.sort和Collections.sort一样,这两个方法在内部调用了排序器和比较器,所以可以直接传一个实现了排序器内部方法和一个实现了比较器内部方法的对象进入。
———————————————————————————————————————
个人学习理解有限,希望各位多多指正