comparator接口与Comparable接口的区别
2014-06-02 22:54
190 查看
这两个接口和集合类本身无关,但通常和集合内的元素有关,因为集合的排序要用到它们中的方法。一个类的实例要想实现排序,必须实现Comparable,或者提供相应的Comparator。
举个例子:
你维护着一个简单的员工数据库,每个员工是一个Employee类的实例。
Employee类可定义为:
Java code
?
EmployeeDatabase类创建Employee类的实例,并把它们存入集合:
Java code
?
现在,你需要检索所有员工,并让他们按一定顺序显示(比如按年龄递增),这时需要用到Collections.sort()方法。Collections.sort()有两种策略:一种是让集合元素本身实现Comparable接口,另一种是使用用户提供的比较器(即Comparator)。
使用第一种策略时,必须修改元素类的定义,让它实现Comparable,因此,你必须把Employee类修改为:
Java code
?
说明一下,因为compareTo()方法约定:本对象大于另一个对象时,返回大于0的整数,小于时返回小于0的整数,等于时返回0。所以,可以直接返回两者年龄的差,来实现按年龄比较。
这样就可以在main()方法中使用Collections.sort(allEmployees);来对员工按年龄排序了。
但是,这种排序是非常不灵活的:
第一,需要修改集合元素类Employee,而很多情况下,我们没有办法修改公共的类。
第二,没有办法实现多种方式排序,如按编号,按姓名,按薪水等等。
这时需要使用另一种策略,即Comparator。Comparator使用其compare()方法返回的整数来比较两个对象,规则和compareTo()一样。
如同样实现年龄比较,使用Comparator时,无需修改Employee类,可以在排序的时候定义相应的比较器。使用Collections.sort()方法的另一个版本:
Java code
?
这里使用了匿名内部类,实际上相当于先定义一个比较器类,如:
Java code
?
再使用:
Collections.sort(allEmployees, new EmployeeComparator());
可以看到,比较器完全独立于元素类Employee,因此可以非常方便地修改排序规则。
你还可以定义一系列比较器,供排序时选择使用,如:
Java code
?
相应的使用方法如:
Collections.sort(allEmployees, new EmployeeSalaryAscendingComparator());
Collections.sort(allEmployees, new EmployeeSalaryDescendingComparator());
等等。。。。
使用Comparator时,元素类无需实现Comparable,因此我们保持最初版本的Employee,但实际应用中,可以用Comparable的compareTo()方法来定义默认排序方式,用Comparator定义其他排序方式。
举个例子:
你维护着一个简单的员工数据库,每个员工是一个Employee类的实例。
Employee类可定义为:
Java code
?
Java code
?
使用第一种策略时,必须修改元素类的定义,让它实现Comparable,因此,你必须把Employee类修改为:
Java code
?
这样就可以在main()方法中使用Collections.sort(allEmployees);来对员工按年龄排序了。
但是,这种排序是非常不灵活的:
第一,需要修改集合元素类Employee,而很多情况下,我们没有办法修改公共的类。
第二,没有办法实现多种方式排序,如按编号,按姓名,按薪水等等。
这时需要使用另一种策略,即Comparator。Comparator使用其compare()方法返回的整数来比较两个对象,规则和compareTo()一样。
如同样实现年龄比较,使用Comparator时,无需修改Employee类,可以在排序的时候定义相应的比较器。使用Collections.sort()方法的另一个版本:
Java code
?
Java code
?
Collections.sort(allEmployees, new EmployeeComparator());
可以看到,比较器完全独立于元素类Employee,因此可以非常方便地修改排序规则。
你还可以定义一系列比较器,供排序时选择使用,如:
Java code
?
Collections.sort(allEmployees, new EmployeeSalaryAscendingComparator());
Collections.sort(allEmployees, new EmployeeSalaryDescendingComparator());
等等。。。。
使用Comparator时,元素类无需实现Comparable,因此我们保持最初版本的Employee,但实际应用中,可以用Comparable的compareTo()方法来定义默认排序方式,用Comparator定义其他排序方式。
相关文章推荐
- Comparator,Comparable接口区别及应用
- OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
- java排序和Comparable,Comparator两个接口区别
- 对象排序之Comparator,Comparable接口区别及应用
- comparator接口与Comparable接口的区别
- Comparable接口与Comparator接口区别
- Comparable与Comparator接口的区别
- Comparable接口与Comparator接口主要区别及实例
- Comparable接口与comparator接口的区别与联系
- comparator接口与Comparable接口的区别
- comparator接口与Comparable接口的区别
- Comparable接口和Comparator接口区别
- 对象排序之Comparator,Comparable接口区别(华为面试题)
- Comparable接口和Comparator接口的区别
- Java中,如果想要排序,实现Comparator接口 //与Comparable 的区别?
- comparable与comparator接口的区别
- comparator接口与Comparable接口的区别
- OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
- comparator接口与Comparable接口的区别
- comparator接口与Comparable接口的区别