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对象时, 比如:
List
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
List
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是定义在Person类的外部的,也就是重新创建一个类实现了Comparator
比如class Comparators implements Comparator
ps:上面不论implement哪一个接口,都需要复写compare(),参数不同而已,但是它们都是返回int类型的值,这个int值(这里用a表示)只有三种情形;
a<0: 第一个参数排在前面
a=0: 两个参数值相等
a>0: 第一个参数排在后面
点击打开代码下载链接