Comparable接口和Comparator接口
1,比较器的作用
Java代码中,我们不仅会对基本数据类型和引用数据类型做值的比较,经常也会需要对一个对象做比较。由此,就需要使用比较器接口来实现相关的比较功能了。
2,比较器接口的种类
2.1,Comparable接口
2.1.1,用法
// UserInfo.java
public class UserInfo implements Comparable<UserInfo> {
private Integer userId;
private Integer age;
private String name;
// 省略了全参构造和Getter,Setter方法
// 需要覆写toString方法
// Comparable接口中需要重写的方法
@Override
public int compareTo(UserInfo o) {
if (this.age - o.getAge() == 0) {
return this.userId - o.getUserId();
}
return this.age - o.getAge();
}
// AppMain.java
public class AppMain {
public static void main(String[] args) {
List<UserInfo> list = new ArrayList<>();
list.add(new UserInfo(1,21,"迈凯伦P1"));
list.add(new UserInfo(2,27,"宝马M2"));
list.add(new UserInfo(3,15,"宝马M3"));
list.add(new UserInfo(6,15,"宝马M4"));
list.add(new UserInfo(5,24,"宝马M5"));
list.add(new UserInfo(4,24,"奥迪RS6"));
list.add(new UserInfo(7,21,"小米SU7"));
Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
// 输出结果
UserInfo{userId=3, age=15, name='宝马M3'}
UserInfo{userId=6, age=15, name='宝马M4'}
UserInfo{userId=1, age=21, name='迈凯伦P1'}
UserInfo{userId=7, age=21, name='小米SU7'}
UserInfo{userId=4, age=24, name='奥迪RS6'}
UserInfo{userId=5, age=24, name='宝马M5'}
UserInfo{userId=2, age=27, name='宝马M2'}
2.1.2,特征
比较器实现与对象类高度耦合
2.1.3,总结
在对象封装度较高的场景下,如果需要修改比较规则就会涉及到对象的修改。
Comparable比较器是在对象内部完成比较。
2.2,Comparator接口
2.2.1,用法
// UserInfo.java与上面相同,唯一区别是不需要实现任何接口
// MyComparator.java
public class MyComparator implements Comparator<UserInfo> {
@Override
public int compare(UserInfo o1, UserInfo o2) {
if (o1.getAge() - o2.getAge() == 0) {
return o1.getUserId() - o2.getUserId();
}
return o1.getAge() - o2.getAge();
}
}
// AppMain.java
public class AppMain {
public static void main(String[] args) {
List<UserInfo> list = new ArrayList<>();
list.add(new UserInfo(1,21,"迈凯伦P1"));
list.add(new UserInfo(2,27,"宝马M2"));
list.add(new UserInfo(3,15,"宝马M3"));
list.add(new UserInfo(6,15,"宝马M4"));
list.add(new UserInfo(5,24,"宝马M5"));
list.add(new UserInfo(4,24,"奥迪RS6"));
list.add(new UserInfo(7,21,"小米SU7"));
MyComparator myComparator = new MyComparator();
Collections.sort(list,myComparator);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
// 输出结果
UserInfo{userId=3, age=15, name='宝马M3'}
UserInfo{userId=6, age=15, name='宝马M4'}
UserInfo{userId=1, age=21, name='迈凯伦P1'}
UserInfo{userId=7, age=21, name='小米SU7'}
UserInfo{userId=4, age=24, name='奥迪RS6'}
UserInfo{userId=5, age=24, name='宝马M5'}
UserInfo{userId=2, age=27, name='宝马M2'}
2.2.2,特征
比较器的实现是单独完成的,不与对象耦合
2.2.3,总结
如果对象没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那就可以实现Comparator接口,自定义比较器。
Comparator比较器是在对象外部完成比较。