Comparable 和 Comparator的理解

简介: Comparable是一个排序接口 此接口给实现类提供了一个排序的方法,此接口有且只有一个方法

对Comparable 的解释

Comparable是一个排序接口

此接口给实现类提供了一个排序的方法,此接口有且只有一个方法

public int compareTo(T o);

compareTo方法接受任意类型的参数,来进行比较

list或者数组实现了这个接口能够自动的进行排序,相关类的方法有Collections.sort(),Arrays.sort();

SortedMap 接口的key内置了compareTo方法来进行键排序,SortedSet 也是内置了compareTo方法作为其内部元素的比较手段

compareTo()方法与equals()方法的比较

compareTo()方法不同于equals()方法,它的返回值是一个int类型

int a = 10 , b = 20 , c = 30 , d = 30;

a.compareTo(b) // 返回 -1 说明 a 要比 b 小
c.compareTo(b) // 返回 1 说明 c 要比 b 大
d.compareTo(c) // 返回 0 说明 d 和c 相等

而equals 方法返回的是boolean 类型

x.equals(y) // true 说明x 与 y 的值 相等 , false 说明x 与 y 的值 不相等

代码

Comparable 更像是一个内部排序接口,一个类实现了Comparable比较器,就意味着它本身支持排序;可以用Collections.sort() 或者 Arrays.sort() 进行排序

public class Student implements Comparable<Student>{

String name;
int record;

public Student(){}
public Student(String name,int record){
this.name=name;
this.record=record;
}

public boolean equals(Student student) {
// 拿名字和成绩进行对比
return name.equals(student.name)
&&record == student.record;
}

@Override
public int compareTo(Studentstu) {
// 调用String 类的compareTo方法,返回值 -1,0,1
return this.name.compareTo(stu.name);
}

get and set...
}


public class ComparableTest{

public static void main(String[] args) {
List<Student> studentList = Arrays.asList(new Student("liming", 90),
new Student("xiaohong", 95),
new Student("zhoubin", 88),
new Student("xiaoli", 94)
);
// 排序前
System.out.println(studentList);
Collections.sort(studentList);
// 排序后
System.out.println(studentList);

for(Student student : studentList){
System.out.println(student.equals(new Student("xiaohong", 95)));
}
}
}

输出:

liming = 90, xiaohong = 95, zhoubin = 88, xiaoli = 94

false true false false

compareTo()方法抛出异常

public int compareTo(To);

NullPointerException : 如果 对象o为null,抛出空指针异常

ClassCastException: 如果需要类型转换之后进行比较,可能会抛出ClassCastException


对Comparator 的解释

Comparator 相当于一个比较器,作用和Comparable类似,也是使用Collections.sort() 和 Arrays.sort()来进行排序,也可以对SortedMap 和 SortedSet 的数据结构进行精准的控制,你可以不用实现此接口或者Comparable接口就可以实现次序比较。 TreeSet 和 TreeMap的数据结构底层也是使用Comparator 来实现。不同于Comparable ,比较器可以任选地允许比较null参数,同时保持要求等价关系。

Comparator比较器的方法

int compare(T o1, T o2);

compare() 方法的用法和Comparable 的 compareTo() 用法基本一样,这个方法不允许进行null值比较,会抛出空指针异常

boolean equals(Object obj);

jdk1.8 之后又增加了很多新的方法

33.jpg

很多都是关于函数式编程的,在这里先不做讨论了

代码实现

public class AscComparator implements Comparator<Student>{

@Override
public int compare(Student stu1, Student stu2) {

// 根据成绩降序排列
return stu1.getRecord() - stu2.getRecord();
}

}

public class ComparatorTest{

public static void main(String[] args) {
List<Student> studentList = Arrays.asList(new Student("liming", 90),
new Student("xiaohong", 95),
new Student("zhoubin", 88),
new Student("xiaoli", 94)
);
// 1. 可以实现自己的外部接口进行排序
Collections.sort(studentList,new AscComparator());

System.out.println(studentList);

// 2、 可以匿名内部类实现自定义排序
Collections.sort(studentList, new Comparator<Student>() {
@Override
public int compare(Student stu1, Student stu2) {
return stu2.getRecord() -stu1.getRecord();
}
});
System.out.println(studentList);
}
}

也可以使用Arrays.sort()进行排序,不过针对的数据结构是数组。


Comparable 和 Comparator 的对比

1、Comparable 更像是自然排序

2、Comparator 更像是定制排序

同时存在时采用 Comparator(定制排序)的规则进行比较。

对于一些普通的数据类型(比如 String, Integer, Double…),它们默认实现了Comparable 接口,实现了 compareTo 方法,我们可以直接使用。

而对于一些自定义类,它们可能在不同情况下需要实现不同的比较策略,我们可以新创建 Comparator 接口,然后使用特定的 Comparator 实现进行比较。

            </div>
目录
相关文章
|
机器学习/深度学习 Linux vr&ar
ARIMA差分自回归移动平均模型
ARIMA是**差分自回归移动平均模型**的引文缩写,其中AR表示的是自回归模型,MA表示的是移动平均模型,I表示的是差分。一般写成ARIMA(p,d,q),p是自回归阶数,q是移动平均阶数,d表示差分的次数。
2131 0
ARIMA差分自回归移动平均模型
|
运维 大数据 云计算
|
11月前
|
人工智能 自然语言处理 搜索推荐
“AI拜年”火遍朋友圈,营销的终局是拼技术
2025年春节前夕,AI拜年成为新潮流。百度通过“春节祝福语”活动,利用文心大模型4.0 Turbo生成个性化拜年贺卡,用户只需上传照片和输入文案,即可获得高度逼真的定制贺卡。这项技术凭借iRAG(检索增强生成)实现了高精度图像生成,避免了常见的“AI味儿”,使AI生成的内容既真实又富有文化内涵,为普通用户带来了专业级的创作体验,也为图像生成的产业化落地铺平了道路。
524 9
|
11月前
|
人工智能 监控 安全
什么是身份治理和管理(IGA)
身份治理和管理(IGA)是身份和访问管理(IAM)的关键组件,部署于云、本地或混合环境。它通过自动化和策略确保用户根据角色获得适当权限,涵盖身份治理(分析、报告、权限管理等)和身份管理(生命周期管理、工作流编排等)。IGA减少人为错误、防止权限滥用,并简化合规性,提升组织安全性和运营效率。
382 6
|
存储 机器学习/深度学习 应用服务中间件
阿里云倚天云服务器实例:计算型c8y、通用型g8y、内存型r8y实例介绍
阿里云倚天云服务器是基于阿里云自研的倚天710 ARM架构CPU打造的高性能计算产品系列,它依托先进的第四代神龙架构,旨在为用户提供稳定可预期的超高效能体验。倚天云服务器在存储、网络性能及计算稳定性方面实现了显著提升,主要得益于其芯片级的快速路径加速技术。本文将深度解析阿里云倚天云服务器的计算型c8y、通用型g8y、内存型r8y实例,探讨其优势及适用场景,以供选择参考。
|
存储 数据可视化 关系型数据库
Ganos矢量快显功能上手
Ganos是由阿里云数据库产品事业部与达摩院合作研发的新一代云原生位置智能引擎,集成于PolarDB、Lindorm、AnalyticDB和RDS PG等核心产品中。Ganos具备十大核心引擎,为数据库提供一体化时空数据处理能力。其2D矢量快显功能采用稀疏金字塔索引技术,显著缩短切片时间和减少存储开销,支持动态更新。通过简单的表结构准备和索引构建,用户可快速实现高效的数据可视化。此外,Ganos还支持3D矢量数据可视化,进一步拓展了应用场景。
254 1
|
测试技术 数据库
『软件测试2』 关于黑盒测试和测试用例的基础知识
该文章讲解了黑盒测试的基本概念以及如何编写有效的测试用例,包括选择合适的输入数据、预期结果的设定和测试执行的步骤。
|
搜索推荐 算法 大数据
VR导航的实现原理、技术优势和应用场景
VR导航结合虚拟现实和室内定位,提供沉浸式精准导航服务,已在商场、机场、停车场、展馆和景区等领域应用,展现巨大潜力。通过模拟真实环境、精准定位和交互控制,提升用户体验。未来,VR导航将与AR、大数据融合,优化交互方式,并在更多场所普及。
515 1
VR导航的实现原理、技术优势和应用场景
|
数据采集 JavaScript 前端开发
Vue框架的优缺点是什么
【7月更文挑战第5天】 Vue框架:组件化开发利于重用与扩展,响应式数据绑定简化状态管理;学习曲线平缓,生态系统丰富,集成便捷,且具性能优化手段。缺点包括社区规模相对小,类型支持不足(Vue 3.x改善),路由和状态管理需额外配置,SEO支持有限。随着发展,部分缺点正被克服。
454 1
|
Java Maven
SpringBoot 引用仓库中没有 第三方包 - 将jar 包安装本地 maven
SpringBoot 引用仓库中没有 第三方包 - 将jar 包安装本地 maven
218 0