在看Java容器框架的时候,看见了这两个接口,有些不明白,这两个接口的区别是什么,Java为什么会存在这两个类似的接口?从网上整理笔记如下。
Comparable && Comparator接口都是用来比较大小的。
1、基本定义和使用场景
Comparable的接口定义:
package java.lang;
import java.util.*;
public
interface
Comparable<T> {
public
int
compareTo
(T o);
}
Comparator的接口定义:
package java.util;
public
interface
Comparator<T> {
int
compare(T o1, T o2);
boolean equals(Object obj);
}
Comparable接口的作用是对实现它的每个类的对象进行排序,这个接口需要类本身去实现。
作用:
-
若一个类实现了Comparable接口,实现Comparable接口的类的对象的List列表(或者数组),可以通过Collections.sort()(或Arrays.sort() )进行排序。
-
实现Comparable接口的类的对象 可以用作 “有序映射”(如SortedMap)中的键 或者 “有序集合(TreeSet)”中的元素,而不需要额外指定比较器。
Comparator接口可以使用在以下场景:
-
如果类是固定的的,无法修改该类自身,而且该类又是final的,无法实现Comparable接口,但是又需要对其排序,那么此时Comparator接口可以派上用场了。在类的外部使用Comparator接口。
-
比如一个类已经实现了Comparable接口,但是由于需求,我们要进行另一种排序规则,而用不允许修改类本身,那么Comparator接口作为比较器派上了用场。
2、举例分析
Person1实现了Comparable接口的compareTo()方法,下面例子就可以使用Collections工具类对其按照写的年龄升序排序。
import
java.util.ArrayList;
import
java.util.Collections;
import
java.util.List;
/**
* Person1实现了Comparable接口,用于类对象的排序
*/
public class
Person1
implements
Comparable<Person1>{
private
String
name
;
private int
age
;
public
Person1(String name,
int
age) {
this
.
age
= age;
this
.
name
= name;
}
@Override
public int
compareTo(Person1 o) {
//用年龄进行排序
return this
.
age
- o.
age
;
}
@Override
public
String toString() {
return
name
+
": "
+
age
;
}
/**
* 测试代码
*
@param
args
*/
public static void
main(String[] args) {
Person1 p1 =
new
Person1(
"张三"
,
20
);
Person1 p2 =
new
Person1(
"李四"
,
18
);
Person1 p3 =
new
Person1(
"王五"
,
30
);
List<Person1> list =
new
ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
System.
out
.println(list);
//使用Collections工具类,对list进行排序
Collections.
sort
(list);
System.
out
.println(list);
}
}
运行结果:
[张三: 20, 李四: 18, 王五: 30]
[李四: 18, 张三: 20, 王五: 30]
如果此时,我们需要对list进行降序排序,而又不允许修改原始类,那么该如何呢?
只需要将Collections.sort(list)代码改成如下:
Collections.
sort
(list,
new
Comparator<Person1>() {
@Override
public int
compare(Person1 o1, Person1 o2) {
return
o2.
age
- o1.
age
;
}
});
运行结果:
[张三: 20, 李四: 18, 王五: 30]
[王五: 30, 张三: 20, 李四: 18]
3、总结
-
Comparable接口是一个排序接口,若一个类实现了该接口,就意味着“该类支持排序”;
-
而Comparator接口是一个比较器接口,若向控制某个类的排序方法(比如经常更改排序规则),可以建立一个该类的比较器进行排序。
-
前者使用固定,与一个具体类绑定;而后者较为灵活,可以给不同需求的比较功能的类使用。