Comparable 和 Comparator 这两个接口一直像 “魔鬼” 同样纠缠着我(在看一些源代码的时候), 碍于浪费时间就一直懒得研究他们, 由于毕竟迄今为止我尚未直接使用他们过。今天趁着有空, 来搞一搞这两个 “B崽子”。ide
Comparable 是以 able 结尾, 一般表示一个对象具备某种能力, Comparator 是以 or 结尾, 一般表示一个对象是什么。固然, 这还不足以帮助咱们理解他们的区别, 结合下面几个方面会好不少。测试
先看 Comparable 的, 以下所示。 只有一个入参, 表示被比较的对象。.net
int compareTo(T o);
再看 Comparator 的, 以下所示。 有两个入参, 他们是相互比较的对象。code
int compare(T o1, T o2);
从下面的测试过程也能够轻松看出来一些区别对象
public void test(){ Student s1 = new Student(); Student s2 = new Student(); // 使用 Comparable 比较两个 Student 对象 int result = s1.compareTo(s2); // 使用 Comparator 比较两个 Student 对象 int result2 = new StudentComParator().compare(s1, s2); } class Student implements Comparable<Student> { [@Override](https://my.oschina.net/u/1162528) public int compareTo(Student s) { // 省略比较逻辑 return 0; } } class StudentComParator implements Comparator<Student>{ [@Override](https://my.oschina.net/u/1162528) public int compare(Student o1, Student o2) { // 省略比较逻辑 return 0; } }
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个能够比较的对象,可是须要修改源代码。 用Comparator 的好处是不须要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象须要做比较的时候,把比较器和对象一块儿传递过去就能够比大小了, 而且在Comparator 里面用户能够本身实现复杂的能够通用的逻辑,使其能够匹配一些比较简单的对象,那样就能够节省不少重复劳动了接口