前言
简单总结java中Comparable和Comparator的一些区别和特点
区别
相同点:两个接口都可以实现排序、比较的功能
不同点:
1.Comparable接口位于java.lang包下;Comparator接口位于java.util包下
2.Comparable为侵入式排序,Comparator为非侵入式排序
Comparable接口
此接口强行对实现它的每个类的对象进行整体排序,此排序也被称为该类的自然排序 。
那要使用该接口必须先实现(implements)这个接口,并重写接口中提供的唯一的一个compareTo()方法,因此会更改原始对象的代码结构即破坏源码,所以称为侵入式排序。
代码如下(示例):
public class User implements Comparable<User>{
private Integer number;
public User(Integer number) {
this.number = number;
}
@Override
public int compareTo(User user) {
if (this.number.compareTo(user.number)>0){
return 1;
}
else if (this.number.compareTo(user.number)<0){
return -1;
}else {
return 0;
}
}
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User(2));
userList.add(new User(1));
userList.add(new User(3));
Collections.sort(userList);
for (User user : userList) {
System.out.println(user.number);
}
}
}
Comparator接口
使用此接口我们可以通过自定义一个新的类来实现Comparator接口中的compare()方法,再作为比较器传参,完成自定义排序。此方法不会侵入到原本的对象中改变代码结构即不会破坏源码,所以称为非侵入式排序,因为较为灵活方便,用户也可以自由实现各种排序方法,所以更加推荐。
代码如下(示例):
//自定义一个新的排序类
public class UserComparator implements Comparator<User> {
@Override
public int compare(User t1, User t2) {
int l=t1.getNumber()-t2.getNumber();
if (l>0){
return 1;
}
else if (l<0){
return -1;
}else {
return 0;
}
}
}
public class User {
private Integer number;
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public User(Integer number) {
this.number = number;
}
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User(2));
userList.add(new User(1));
userList.add(new User(3));
UserComparator userComparator = new UserComparator();
Collections.sort(userList,userComparator);
for (User user : userList) {
System.out.println(user.getNumber());
}
}
}
补充:
进行排序时,Collections.sort(),List.sort(),Arrays.sort()的区别
参考大佬的文章:
https://www.jianshu.com/p/f36c83520a56
https://www.codenong.com/cs106857857/