论JAVA 两种“对象比较接口“的区别
前言
总所周知,java对象的比较有 三种方式
最简单的是可以调用equals().
因为这个方法定义在Object类中,而我们的类都继承了Object类.所以我们自己定义的类都可以使用这个方法.
除此以外还有两个比较接口,可以通过实现他们的某些方法比较我们的对象
他们是 Comparable 和 Comparator!
Comparable 接口
- 方法:
int compareTo(T o) - 用途: 定义对象的自然排序。
- 实现: 当一个类实现
Comparable接口时,它必须重写compareTo()方法。这个方法用于比较当前对象与指定对象的顺序。
光这么说可能有点抽象,我们直接看代码
class Person implements Comparable<Person> {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}public int getAge() {return age;} @Overridepublic int compareTo(Person other) {return Integer.compare(this.age, other.age); // 按年龄升序排序}@Overridepublic String toString() {return name + " (" + age + ")";}
}
// 使用示例List<Person> people = new ArrayList<>();people.add(new Person("Alice", 30));people.add(new Person("Bob", 25));people.add(new Person("Charlie", 35));Collections.sort(people);System.out.println(people); // 输出: [Bob (25), Alice (30), Charlie (35)]
通过这个代码我们可以看到, 我首先创建了一个Person类,接入了 Comparable 接口
又重写了compareTo 这个方法
这里有一个问题我想提一嘴,为什么用的是包装类Integer 去比较,而不是int
答:
-
Integer是一个对象:Integer类提供了比较的方法,比如compareTo()和静态方法Integer.compare(), 这些方法可以直接用于比较两个Integer对象。 -
int是基本类型: 基本数据类型没有方法,因此不能直接调用比较函数。虽然你可以使用运算符(如>或<)来比较int值,但在需要使用排序或集合等高级操作时,必须依赖于对象的方法。
我们可以看看Integer的 代码
public final class Integer extends Number implements Comparable<Integer>
我们可以得出结论:
Integer 类实现了 Comparable 接口,允许你比较两个 Integer 对象。这使得 Integer 可以使用 compareTo() 方法进行自然排序。
而我们的int就没有这个待遇了
它的特点
侵入性很强,直接写在类里面了,每次使用都会是这个比较原则
Comparator比较器
如果去使用 这个接口,我们需要一个比较器对象,实现这个接口
class NameComparator implements Comparator<Person>
{@Overridepublic int compare(Person o1, Person o2) {return o1.name.compareTo(o2.name);}
}
还是刚刚的类,刚刚的例子
List<Person> people2 = new ArrayList<>();people2.add(new Person("Alice", 30));people2.add(new Person("Charlie", 35));people2.add(new Person("Bob", 25));Collections.sort( people2, new NameComparator());System.out.println( people2); // 输出: [Alice (30), Bob (25), Charlie (35)]
它的特点
非侵入性,即不会影响类本身的排序原则。
关于Collections
我们这里使用了Collections,这是一个工具类,有sort方法
我们看看它的代码
public static <T extends Comparable<? super T>> void sort(List<T> list) {list.sort(null);}public static <T> void sort(List<T> list, Comparator<? super T> c) {list.sort(c);}
Collections类中的sort()方法可以接收实现了List接口的任何集合,如ArrayList和LinkedList,并支持使用Comparable接口或Comparator比较器对其元素进行排序。这使得我们能够灵活地对不同类型的列表进行排序,便于管理和操作数据。
完整代码
import java.util.*;
class Person implements Comparable<Person> {public String name;public int age;public Person(String name, int age) {this.name = name;this.age = age;}public int getAge() {return age;} @Overridepublic int compareTo(Person other) {return Integer.compare(this.age, other.age); // 按年龄升序排序}@Overridepublic String toString() {return name + " (" + age + ")";}
}
class NameComparator implements Comparator<Person>
{@Overridepublic int compare(Person o1, Person o2) {return o1.name.compareTo(o2.name);}
}
public class Com
{public static void main(String[] args){// 使用示例List<Person> people = new ArrayList<>();people.add(new Person("Alice", 30));people.add(new Person("Bob", 25));people.add(new Person("Charlie", 35));Collections.sort(people);System.out.println(people); // 输出: [Bob (25), Alice (30), Charlie (35)]List<Person> people2 = new ArrayList<>();people2.add(new Person("Alice", 30));people2.add(new Person("Charlie", 35));people2.add(new Person("Bob", 25));Collections.sort( people2, new NameComparator());System.out.println( people2); // 输出: [Alice (30), Bob (25), Charlie (35)]}
}
结尾
本文算是笔者的第二篇备忘录吧,学习路上对于细节知识笔者总是喜欢刨根问底,为了不浪费幸苦得出的知识,笔者写下这篇博客供大家伙也参考参考
相关文章:
论JAVA 两种“对象比较接口“的区别
前言 总所周知,java对象的比较有 三种方式 最简单的是可以调用equals(). 因为这个方法定义在Object类中,而我们的类都继承了Object类.所以我们自己定义的类都可以使用这个方法. 除此以外还有两个比较接口,可以通过实现他们的某些方法比较我们的对象 他们是 Com…...
在线代理提取IP:一文详解其含义和应用
在互联网时代,IP地址就像是每台设备的“身份证”。然而,有时候,我们需要隐藏或更改这个“身份证”,这时候,代理IP就派上了用场。那么,在线代理提取IP究竟是什么意思呢?让我们一起来探讨一下。 …...
linux-字符串函数使用
linux-字符串函数使用 输入输出长度大小拼接拷贝填充查找比较 字符串的输入,输出,长度,大小,拼接,拷贝,填充,查找,比较 输入 相关的函数有: gets()、getchar()、fgetc(…...
Python 06 Set
Python 实例教程 Python 实例教学_ 06_集合第二十八课[2351. 第一个出现两次的字母](https://leetcode.cn/problems/first-letter-to-appear-twice/)[217. 存在重复元素](https://leetcode.cn/problems/contains-duplicate/)[219. 存在重复元素 II](https://leetcode-cn.com/pr…...
ControllerAdvice定义统一异常处理
springboot版本:2.6.13<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>在实体上添加校验注解,例如: NotBlankNotEmpty…...
Leetcode 162.寻找峰值
峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时间复杂度为 O(…...
c语言:知识补充
c语言中编译开始会对#define,#include等内容做预处理,可以用#define写一些简单函数,方便使用 #include <stdio.h> #include <stdlib.h>#define MAX(A, B) ((A) > (B) ? (A) : (B))int main(){printf("%d\n", MAX(…...
Dapper介绍及特性
一、Dapper介绍及特性 Dapper是一个.NET平台上的轻量级对象关系映射(ORM)工具,它通过扩展IDbConnection接口,提供了一系列的扩展方法来执行SQL查询并将结果映射到.NET对象中。Dapper以其高性能和简单易用著称,特别适合…...
LeetCode 149. 直线上最多的点数
LeetCode 149. 直线上最多的点数 给你一个数组 points ,其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 示例 1: 输入:points [[1,1],[2,2],[3,3]] 输出:3 示例 2: 输入&…...
案例研究丨国控星鲨利用DataEase释放数据潜能,重塑业务视野
国药控股星鲨制药(厦门)有限公司(以下简称为国控星鲨)始创于1952年,前身为厦门鱼肝油厂,距今已经有70余年历史,是国家商务部认定的“中华老字号”企业。2011年,国药控股与厦门轻工集…...
网络基础概念和 socket 编程
网络基础概念和 socket 编程 学习目标: 了解 OSI 七层模型、TCP/IP 四层模型结构了解常见的网络协议格式掌握网络字节序和主机字节序之间的转换理解 TCP 服务器端通信流程理解 TCP 客户端通信流程实现 TCP 服务器端和客户端的代码 推荐一个非常好的学习资料仓库 协…...
TypeScript 中的接口、泛型与自定义类型
TypeScript 是一种超集语言,它为 JavaScript 添加了静态类型检查。通过 TypeScript,开发者可以获得更好的工具支持,并且能够编写出更加健壮的代码。本文将探讨 TypeScript 中的几个关键特性:接口、泛型以及如何创建自定义类型。 …...
常州威雅学校:跟随这场音乐盛宴,溯回她的音乐之路
时同学 常州威雅2021届毕业生 英国皇家北方音乐学院 钢琴系 西太湖畔清凉的晚风送来阵阵悦耳的钢琴声,时同学在母校的个人钢琴独奏悄然拉开序幕。这是她自毕业三年后,在常州威雅的首场钢琴独奏会。 随着第一个音符落下,她用手指在黑白键盘…...
【YashanDB知识库】由于hist_head$中analyze time小于tab$中analyze time导致的sql语句执行慢
本文内容来自YashanDB官网,具体内容请见https://www.yashandb.com/newsinfo/7459465.html?templateId1718516 问题现象 某局点yashandb cpu使用率100%,经线上分析是由于几个sql执行慢,其中一个sql为简单的单行等值绑定变量过滤排序。 经分…...
【有啥问啥】深度理解主动学习:机器学习的高效策略
深度理解主动学习:机器学习的高效策略 在大数据时代,数据量的爆炸性增长与有限的标注资源之间的矛盾日益凸显。如何高效地利用标注资源来训练高质量的模型,成为了机器学习领域亟待解决的问题。主动学习(Active Learning, AL&…...
智能守护者X100 - 自动化生产线智能机器人安全监控管理系统
1.产品介绍 产品名称: 智能守护者X100 - 自动化生产线智能机器人安全监控管理系统 主要功能: 全方位实时监控:智能守护者X100采用高清摄像头与红外夜视技术,实现对自动化生产线及智能机器人的360无死角监控。系统能自动识别并追踪生产线上的机器人活动轨迹,确保生产安全…...
harmonyos面试题
你在项目中用过线程通信吗,线程是怎么进行通信的? 页面的生命周期有哪些? UAbility的生命周期呢? 你在项目中使用首选项主要用来数什么 组件通信的方式有息些 弹室UI是怎么在页面UI中使用的 常用的修饰符有愿些介绍一下 缓冲区是什么与16进制和数组有什么关…...
神经网络介绍及其在Python中的应用(一)
作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~ 个人主页:小高要坚强的博客 当前专栏:Python之机器学习 本文内容:神经网络介绍及其在Python中的线性回归应用 作者“三要”格言:要坚…...
数据流处理技术与Flink框架
一数据流 数据流定义: 数据流(Data Stream)是指数据以连续不断的方式到达和处理的序列。在现实世界中,许多数据来源都是以流的形式存在,比如: 1. 用户行为:用户在网站上的点击流、移动应用中…...
qt中QTatlewidget类常用操作表格的函数有哪些?
在Qt中,QTableWidget 类提供了丰富的函数来操作表格数据。以下是一些常用的操作表格的函数: 1. 初始化与配置 构造函数:QTableWidget(int rows, int columns, QWidget *parent nullptr):创建一个指定行数和列数的表格控件。设置…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
文章目录 一、开启慢查询日志,定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...
