相同点:都是用于比较,排序的接口。例如对于List对象,如果存储的对象类型不是自定义的,像String那样已经实现了Comparable接口,可以直接Collections.sort(Stringlistname),就可以排出序来了。而对于自定义的对象类型,就需要我们自己去实现Comparator或者Comparable接口。
不同点:Comparable是在自定义类的内部实现的,在类声明的地方加上implements Comparable,然后在其内部实现compare方法。Comparator是在自定义类的外部自定义一个比较类,这个比较类要实现Comparator接口,实现compare方法。也可以不具体定义一个比较类,直接在Comparator的内部将compare方法实现就可以了。总之就是要自己实现一个比较器。
下面通过代码直观的说明:
自定义类为A1:
(1)A1类内实现Comparable:
进行排序验证:

输出结果:
(2)A1类外实现Comparator:
①定义一个具体的类实现Comparator:
进行排序验证:

输出结果同上。
②无需定义一个具体的实现类,直接new一个Comparator:

输出结果同上。
综合:两种方法各有优劣,实现Comparable的方法,一劳永逸,但是需要修改自定义类的源代码。Comparator不需要修改源代码,但是需要在使用的地方对Comparator进行实现。
原文 :www.hzlxwx.com