完全毁灭 Comparable 和 Comparator 带给个人噩梦

开篇

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 里面用户能够本身实现复杂的能够通用的逻辑,使其能够匹配一些比较简单的对象,那样就能够节省不少重复劳动了接口

相关文章
相关标签/搜索