Comparable接口和Comparator接口

news2024/12/29 2:28:26

在这里插入图片描述

前言

Java中基本数据类型可以直接比较大小,但引用类型呢?同时引用对象中可能存在多个可比较的字段,那么我们该怎么比较呢?

Java中引用类型不能直接进行大小的比较,这种行为在编译器看来是危险的,所以会编译失败;
想要实现引用类型的比较,那么我们可以实现Comparable接口和Comparator接口

1 Comparable接口

Comparable接口是JDK提供的泛型比较接口类,源码实现大概如下:

//<T>中写比较的类
public interface Comparable<T> {
	//返回值
	// < 0,表示this指向的对象小于o指向的对象
	// > 0,表示this指向的对象大于o指向的对象
	// == 0,表示this指向的对象等于o指向的对象
	int compareTo(T o);
}

通常对于用户自定义类型,如果想要按照大小进行比较,那么我们需要在定义类的时候实现Comparable接口,并重写compareTo方法。

//存在一个Person类,根据年龄比较大小
public class Person implements Comparable<Person> {
	public String name;
	public int age;

	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}

	//重写compareTo方法
	int compareTo(Person o) {
		if(o == null) {
			return 1;
		}
		return this.age - o.age;
	}
}

//Main.java
public class Main {
	public static void main(String[] args) {
		Person person1 = new Person("lisi",18);
		Person person2 = new Person("wangwu",35);

		//比较person1和person2的年龄大小
		System.out.println("person1 是否大于 person2 ?");
		System.out.println(person1.compareTo(person2) > 0);
		
	}
}

2 Comparator接口

基于比较器方式进行比较,Comparator定义如下:

//<T>中写比较的类
public interface Comparator<T> {
	//返回值
	// < 0,表示this指向的对象小于o指向的对象
	// > 0,表示this指向的对象大于o指向的对象
	// == 0,表示this指向的对象等于o指向的对象
	int compare(T o1,T o2);
}

我们知道Person类的比较不仅可以根据年龄还可以根据姓名来进行比较,但是当Comparable接口中的compareTo方法被重写后,我们就不能轻易修改,这时候该如何解决呢?
用户自定义比较器类,实现Comparator接口,并重写其中的compare方法。

//也就是说我们可以定义两个比较器类来实现接口Comparator接口
//AgeComparator.java实现年龄比较
public class AgeComparator implements Comparator<Person> {
	//根据年龄比较
	public int compare(Person o1,Person 02) {
		if(o1 == o1) {
			return 0;
		}
		if(o1 == null || 02 == null) {
			return -1;
		}
		return o1.age - o1.age;
	}
 
} 

//NameComparator.java实现年龄比较
public class NameComparator implements Comparator<Person> {
	//根据年龄比较
	public int compare(Person o1,Person 02) {
		if(o1 == o1) {
			return 0;
		}
		if(o1 == null || 02 == null) {
			return -1;
		}
		return o1.name.compare(o2);
	}
 
} 

//Main.java
public class Main {
	public static void main(String[] args) {
		Person person1 = new Person("lisi",18);
		Person person2 = new Person("wangwu",35);

		//根据自定义比较器类分别比较年龄和姓名
		System.out.println("根据姓名比较:");
		NameComparator nameComparator = new NameComparator();
		System.out.println("person1姓名 是否大于 person2姓名 ?");
		System.out.println(nameComparator.compare(person1,person2)> 0);
		
		System.out.println("根据年龄比较:");
		AgeComparator ageComparator = new AgeComparator();
		System.out.println("person1年龄 是否大于 person2年龄 ?");
		System.out.println(ageComparator.compare(person1,person2)> 0);	
	}
}


Comparable接口和Comparator接口都可以用于对象的比较,Comparable一般在当前类中使用,对当前类的侵入性比较强,Comparator对当前类的侵入性较弱,可以脱离当前类使用,当需要实现一个比较器对象。
#对象的比较 对象的比较一般可以使用父类继承下来的equals()方法(根据使用场景可重写)、实现Comparable接口并重写其中的compareTo() 方法,构造比较器类实现Comparator接口并重写compare()方法。

重写方法解释
Object.equals();所有类都继承于Object类
Comparable.compareTo();自定义类手动实现接口,对当前类侵入性较强
Comparator.compare();需要构造比较器类对象,对当前类侵入性较弱

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员在AI时代的生存指南:打造不可替代的核心竞争力

在这个AI大行其道的时代&#xff0c;似乎每天都有新的语言模型像变魔术一样涌现出来&#xff0c;比如ChatGPT、midjourney、claude等等。这些家伙不仅会聊天&#xff0c;还能帮忙写代码&#xff0c;让程序员们感受到了前所未有的“压力”。我身边的一些程序员朋友开始焦虑&…

SpringCloud入门(十)统一网关Gateway

一、网关的作用 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 …

E. Tree Pruning Codeforces Round 975 (Div. 2)

原题 E. Tree Pruning 解析 本题题意很简单, 思路也很好想到, 假设我们保留第 x 层的树叶, 那么对于深度大于 x 的所有节点都要被剪掉, 而深度小于 x 的节点, 如果没有子节点深度大于等于 x, 那么也要被删掉 在做这道题的时候, 有关于如何找到一个节点它的子节点能通到哪里,…

关于鸿蒙next 调用系统权限麦克风

使用app的时候都清楚&#xff0c;想使用麦克风、摄像头&#xff0c;存储照片等&#xff0c;都需要调用系统的权限&#xff0c;没有手机操作系统权限你也使用不了app所提供的功能&#xff0c;虽然app可以正常打开&#xff0c;但是你需要的功能是没办法使用的。今天把自己在鸿蒙学…

想怎样书写HTML5自结束标签,您随意就好(✪▽✪)

书写后接斜杠还是不接&#xff0c;看过ai给的详细解析就不再迷茫了。 (笔记模板由python脚本于2024年10月03日 10:42:41创建&#xff0c;本篇笔记适合HTML5标签的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖…

【数据库差异研究】update与delete使用表别名的研究

目录 ⚛️总结 ☪️1 Update ♋1.1 测试用例UPDATE users as a SET a.age 111 WHERE a.name Alice; ♏1.2 测试用例UPDATE users as a SET a.age 111 WHERE name Alice; ♐1.3 测试用例UPDATE users as a SET age 111 WHERE a.name Alice; ♑1.4 测试用例UPDATE us…

TIM“PWM”输出比较原理解析

PWM最重要的就是占空比&#xff0c;所有都是在为占空比服务&#xff0c;通过设置不同的占空比&#xff0c;产生不同的电压&#xff0c;产生不同的效果 定时器的输出通道 基本定时器&#xff1a; 基本定时器没有通道 通用定时器&#xff1a; 4个通道&#xff08;CH1, CH2, C…

Python性能优化:实战技巧与最佳实践

Python性能优化&#xff1a;实战技巧与最佳实践 Python 作为一种动态解释型语言&#xff0c;虽然以其简洁和易用性闻名&#xff0c;但在性能方面可能不如静态编译型语言如 C 和 Java 高效。为了在高性能要求的应用场景下更好地利用 Python&#xff0c;我们需要掌握一些常见的优…

STM32GPIO输入和输出

一、先看IO端口位的结构 上面部分是输入&#xff0c;下面是输出。 1、I/O输入&#xff1a; 首先&#xff0c;从I/O引脚开始&#xff0c;有两个保护二极管&#xff0c;主要作用是对输入电压限幅&#xff0c;保护内部电路。上面二极管接VDD为3.3V,下面二极管接VSS为0V。当输入电…

认知杂谈71《创业抉择:定制化与标准化的权衡之路》

内容摘要&#xff1a; *嘿&#xff0c;彦祖们&#xff01;今天来聊聊创业的事&#xff0c;创业选产品类型很关键。定制化产品如魔法&#xff0c;贴合客户需求但成本高且有边际递减风险。要掌握物联网技术&#xff0c;用 3D 建模软件&#xff0c;参考特定书籍&#xff0c;参加展…

在线JSON可视化工具--支持缩放

先前文章提到的超好用的JSON可视化工具&#xff0c;收到反馈&#xff0c;觉得工具好用&#xff0c;唯一不足就是不能缩放视图&#xff0c;其实是支持的&#xff0c;因为滚轮有可能是往下滚动&#xff0c;会与缩放冲突&#xff0c;所以这个工具设计为需要双击视图来触发打开缩放…

C++ 线性表、内存操作、 迭代器,数据与算法分离。

线性表&#xff1a; 线性表是最基本、最简单、也是最常用的一种数据结构。线性表&#xff08;linear list&#xff09;是数据结构的 一种&#xff0c;一个线性表是n个具有相同特性的数据元素的有限序列。 线性表中数据元素之间的关系是一对一的关系&#xff0c;即除了第一个和…

Ubuntu2404安装

Ubuntu是一款非常优秀的发行版本&#xff0c;起初她的优势主要在于桌面版&#xff0c;但是随着Centos 从服务版的支持的退出&#xff0c;Ubuntu server也在迅猛的成长&#xff0c;并且不断收获了用户&#xff0c;拥有了一大批忠实的粉丝。好了&#xff0c;废话不多说&#xff0…

基于SSM的出租车租赁管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 1 选题的背景 现代社会&#xff0c;许多个人、家庭&#xff0c;因为生活、工作方式的改变&#xff0c;对汽车不再希望长期拥有&#xff0c;取而代之的是希望汽车能“召之即…

CSS 实现楼梯与小球动画

CSS 实现楼梯与小球动画 效果展示 CSS 知识点 CSS动画使用transform属性使用 页面整体布局 <div class"window"><div class"stair"><span style"--i: 1"></span><span style"--i: 2"></span>…

Flask-3

文章目录 ORMFlask-SQLAlchemySQLAlchemy中的session对象数据库连接设置常用的SQLAlchemy字段类型常用的SQLAlchemy列约束选项 数据库基本操作模型类定义 数据表操作创建和删除表 数据操作基本查询SQLAlchemy常用的查询过滤器SQLAlchemy常用的查询结果方法多条件查询分页器聚合…

Rstudio:强大的R语言集成开发环境(IDE)

Rstudio 应该是 R 语言使用的标配&#xff0c;尽管 Rstudio 的母公司 Posit 推出了新一代的集成开发环境 Positron&#xff0c;但其还处于开发阶段。作为用户不妨让其成熟后再使用&#xff0c;现阶段还是 Rstudio 更稳定。 如果你在生物信息学或统计学领域工作&#xff0c;R语言…

C初阶(六)--- static 来喽

前言&#xff1a;C语言中有许多关键字&#xff08;关键字是预先保留的标识符&#xff0c;具有特殊意义&#xff0c;不能用作变量 名、函数名等普通标识符。&#xff09; 比如&#xff1a;前面在变量与常量那一节提到的extern 就是一个关键字&#xff0c;应该还记得e…

开源项目 - 交通工具检测 yolo v3 物体检测 单车检测 车辆检测 飞机检测 火车检测 船只检测

开源项目 - 交通工具检测 yolo v3 物体检测 单车检测 车辆检测 飞机检测 火车检测 船只检测 开源项目地址&#xff1a;https://gitcode.net/EricLee/yolo_v3 示例&#xff1a;

点云补全 学习笔记

目录 Depth completion with convolutions and vision transformers 依赖项&#xff1a; DCNv2 softpoolnet Depth completion with convolutions and vision transformers Zhang, Y., Guo, X., Poggi, M., Zhu, Z., Huang, G., Mattoccia, S.: Completionformer: Depth co…