比较器-Comparable和Comparator
Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。可以使用Arrays.sort()对改类进行排序
1.Comparable接口
使用场景:假如说我们有这样一个需求,需要设计一个Person类,有两个属性:姓名(name)、年龄(age),按照年龄的大小进行排序,那么实现可以这样
注意:
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Person o) {
if (this.age > o.age) {
return 1;
} else {
return -1;
}
// return Integer.compare(this.age, o.age);
}
}
public static void main(String[] args) {
Person[] people = new Person[]{
new Person("张三",25),
new Person("李四",17),
new Person("王五",35),
};
Arrays.sort(people);
System.out.println(Arrays.toString(people));
}
Comparable
2.Comparator接口
Comparator也是一个比较器,但是属于挽救设计的一种,一般来说尽量减少。
使用场景:假如说我们有这样一个需求,需要对Person类的年龄进行排序,但是Person类是别人写好的,里面没有Comparable接口,如果在不允许改变源代码的情况下,我们可以使用Comparator接口。
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return Integer.compare(o1.getAge(), o1.getAge());
}
}
public static void main(String[] args) {
Person[] people = new Person[]{
new Person("张三",25),
new Person("李四",17),
new Person("王五",35),
};
Arrays.sort(people, new PersonComparator()); // 这里需要加入比较器
System.out.println(Arrays.toString(people));
}
// 当然上述的类为了方便查看,所以专门写出来,可以看到PersonComparator类中只有一个方法,可以使用匿名类的方式来进行编写
public static void main(String[] args) {
Person[] people = new Person[]{
new Person("张三",25),
new Person("李四",17),
new Person("王五",35),
};
Arrays.sort(people, (p1, p2)-> Integer.compare(p1.getAge(), p2.getAge())); // 这样写就不需要类比较器了
// Arrays.sort(people, Comparator.comparing(Person::getAge)); // 最简写法
System.out.println(Arrays.toString(people));
}
总结
Comparable和Comparator的区别:
java.lang.Comparable:在类定义的时候,可以实现好的接口,里面有compareTo这个方法需要实现。
java.util.Comparator:是挽救的比较接口,需要单独定义一个比较类,里面有compare比较方法。
在设计阶段,我们使用比较多的是Comparable接口。
但在实际开发过程中的话,我们通常使用匿名内部类的方式,所以更多使用的是Comparator,不过一般是在算法题中使用,真正在项目中使用的情况确实不多。
参考:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~