Comparator和Comparable排序

Java API针对集合类型排序提供了两种支持:

java.util.Collections.sort(java.util.List) 

java.util.Collections.sort(java.util.List, java.util.Comparator) 

第一个方法要求所排序的元素类必须实现java.lang.Comparable接口

第二个方法要求实现一个java.util.Comparator接口

java.util.Comparator接口与java.util.Comparable接口的区别:

 Comparator和Comparable相同的地方:

两个都是java接口, 用来对自定义class比较大小的;

什么是自定义class?比如public class Person{ String name; int age }

 

当我们有这么一个List,里面包含等Person对象时, 比如:

ListmList=new ArrayList();

mList.add(new Person("zhangsan",1));

mListt.add(new Person("liming",2));

mList.add(new Person("wangwu",3));

这时我们不能直接使用Collections.sort(mList)进行排序,因为Person类并没有实现Comparable接口,除非这样Person implement Comparable;但是Stirng却是可以排序比如:

ListmList=new ArrayList();

mList.add("a");

mList.add("b");

mList.add("c");

此时Collections.sort(mList)是可以将mList中的元素排序.

这是因为String已经实现了Comparable接口,看看String类源代码下图:

Comparable和Comparator的区别:

Comparable定义在Person类的内部,也就是自身实现了这个接口;

因为已经实现了比较器,那么我们的Person现在是一个可以比较大小的对象,它的比较功能和String完全一样,可以随时随地的拿来比较大小,因为Person现在自身就是有大小之分的。Collections.sort(List)可以得到正确的结果,看图如下一目了然;

Comparator和Comparable排序_第1张图片

而Comparator是定义在Person类的外部的,也就是重新创建一个类实现了Comparator;

比如class Comparators implements Comparator{}这个比较器里面按照自定义规则对Person的大小进行比较;这时通过Collections.sort(mList,new PersonCompartors())可以得到正确的比较结果,如下图;

Comparator和Comparable排序_第2张图片

 ps:上面不论implement哪一个接口,都需要复写compare(),参数不同而已,但是它们都是返回int类型的值,这个int值(这里用a表示)只有三种情形;

a<0: 第一个参数排在前面

a=0: 两个参数值相等

a>0: 第一个参数排在后面

        点击打开代码下载链接

 

你可能感兴趣的:(Comparator和Comparable排序)