Java中Comparable讲解
Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。可以使用Arrays.sort()对改类进行排序。
讲解
1.Comparable接口
使用场景:假如说我们有这样一个需求,需要设计一个Person类,有两个属性:姓名(name)、年龄(age),按照年龄的大小进行排序,那么实现可以这样
package com.ikos.web; import java.util.Arrays; class Person implements Comparable<Person>{ int age; String name; public Person(String name,int age){ this.name = name; this.age = age; } @Override public String toString() { // TODO Auto-generated method stub return "姓名:"+name+","+"年龄:"+age+";"; } @Override public int compareTo(Person o) { // TODO Auto-generated method stub if(this.age>o.age){ return 1; }else if(this.age<o.age){ return -1; } //当然也可以这样实现 // return Integer.compare(this.age, o.age); return 0; } public static void main(String[] args) { Person []persons = new Person[]{ new Person("张三",15), new Person("李四",25), new Person("王五",20) }; Arrays.sort(persons); System.out.println(Arrays.toString(persons)); System.out.println(persons[0]==persons[1]); System.out.println(persons[0].equals(persons[1])); } }
结果:
注意细节:
Comparable<T>接口里面有一个泛型T,T的选择为可以与之比较的对象的类型,一般就是实现该接口类的本身,可以这样想和Person类比较的当然是Person本身了。
Comparable<T>只是在Arrays里面起作用,其他地方目前我并没有发现什么作用,包括运算符和equals上,这个接口也不起什么作用
2.Comparator接口
Comparator也是一个比较器,但是属于挽救设计的一种,一般来说尽量减少。
下面的例子演示了Comparator泛型的使用"extends"如何使用在一般意义上的意思"extends"(类)或者"implements"(接口)。
该例子中的泛型方法返回三个可比较对象的最大值。
package com.ikos.web;
import java.util.Arrays;
class Person {
// 比较三个值并返回最大值
public static <T extends Comparable<T>> T maximum(T x, T y, T z)
{
T max = x; // 假设x是初始最大值
if ( y.compareTo( max ) > 0 ){
max = y; //y 更大
}
if ( z.compareTo( max ) > 0 ){
max = z; // 现在 z 更大
}
return max; // 返回最大对象
}
public static void main(String[] args) {
System.out.printf( "%d, %d 和 %d 中最大的数为 %d\n\n",
3, 4, 5, maximum( 3, 4, 5 ) );
System.out.printf( "%s, %s 和 %s 中最大的数为 %s\n","abc",
"zabc", "orange", maximum( "abc", "zabc", "orange" ) );
}
}
结果输出:
3, 4 和 5 中最大的数为 5
abc, zabc 和 orange 中最大的数为 zabc
总结
Comparable和Comparator的区别:
- java.lang.Comparable:在类定义的时候,可以实现好的接口,里面有compareTo这个方法需要实现。
- java.util.Comparator:是挽救的比较接口,需要单独定义一个比较类,里面有compare比较方法。
在更多情况下我们使用比较多的还是Comparable接口,在实际开发过程中的话,其实两者使用都比较少。
佛语:我本求心不求佛,了知三界空无物,若欲求佛但求心,只这心心心是佛
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2019-05-26 设计模式(六)观察者模式
2019-05-26 设计模式(五)之适配器模式
2019-05-26 设计模式(四)注册模式 解决:解决全局共享和交换对象
2019-05-26 设计模式(三)单例模式
2019-05-26 设计模式(二)之策略模式
2019-05-26 设计模式的类型有哪些?
2019-05-26 spl_autoload_register 和 __autoload()魔术方法