Java中Comparable和Comparator有什么区别?

1. 字面含义不同

Comparable字面意思是“具有比较能力”,Comparator字面意思是“比较器”。

2. 用法不同

Comparable用法:对需要排序的类,实现Comparable接口,重写compareTo()方法。

Comparator用法:创建自定义比较器,实现Comparator接口,重写compare()方法。还通过匿名类的方式更快速便捷的完成自定义比较器的功能。

3. 使用场景不同

Comparable必须修改原有的类,也就是说要排序哪个类,就要在哪个类中实现Comparable接口,并重写compareTo()方法。所以Comparable更像对内进行排序。

Comparator无需修改原有类,也就是说,通过Comparator接口可以实现和原有类的解耦,在不修改原有类的情况下,实现排序功能,所以Comparator可以看做对外提供排序的接口。

4. 示例

4.1 没有实现任何接口

package test;import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.ArrayList;public class test1 {public static void main(String[] args) {//创建对象Person p1 = new Person(1, 18, "Java");Person p2 = new Person(2, 22, "MySQL");Person p3 = new Person(3, 6, "Redis");//添加到集合ArrayList<Person> list = new ArrayList<>();list.add(p1);list.add(p2);list.add(p3);//打印集合信息for (Person p : list) {System.out.println(p.getName() + ": " + p.getAge());}}
}@Getter
@Setter
@ToString
class Person{private int id;private int age;private String name;public Person(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}
}

运行结果:

Java: 18
MySQL: 22
Redis: 6

从运行结果看到,没有进行任何排序操作

4.2 实现Comparable接口

package test2;import lombok.Getter;
import lombok.Setter;
import lombok.ToString;import java.util.ArrayList;
import java.util.Collections;public class test2 {public static void main(String[] args) {//创建对象Person p1 = new Person(1, 18, "Java");Person p2 = new Person(2, 22, "MySQL");Person p3 = new Person(3, 6, "Redis");//添加到集合ArrayList<Person> list = new ArrayList<>();list.add(p1);list.add(p2);list.add(p3);Collections.sort(list);//打印集合信息for (Person p : list) {System.out.println(p.getName() + ": " + p.getAge());}}
}@Getter
@Setter
@ToString
class Person implements Comparable<Person> {private int id;private int age;private String name;public Person(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}@Overridepublic int compareTo(Person p) {//降序:比较对象-当前对象return p.getAge() - this.getAge();//升序:当前对象-比较对象//return this.getAge()-p.getAge();}
}

运行结果:

MySQL: 22
Java: 18
Redis: 6

4.3 实现Comparator接口

package test3;import lombok.Getter;
import lombok.Setter;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class test3 {public static void main(String[] args) {//创建对象Person p1 = new Person(1, 18, "Java");Person p2 = new Person(2, 22, "MySQL");Person p3 = new Person(3, 6, "Redis");//添加到集合ArrayList<Person> list = new ArrayList<>();list.add(p1);list.add(p2);list.add(p3);//进行排序操作(根据PersonComparator中定义的排序规则排序)Collections.sort(list,new PersonComparator());//打印集合信息for (Person p : list) {System.out.println(p.getName() + ": " + p.getAge());}}
}/*** 用于Person类的比较器*/
class PersonComparator implements Comparator<Person> {@Overridepublic int compare(Person p1, Person p2) {//升序: 比较对象1 - 比较对象2return p1.getAge()-p2.getAge();//降序: 比较对象2 - 比较对象1//return p2.getAge()-p1.getAge();}
}@Getter
@Setter
class Person {private int id;private int age;private String name;public Person(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}
}

运行结果:

Redis: 6
Java: 18
MySQL: 22

4.4 使用Comparator匿名类

package test4;import lombok.Getter;
import lombok.Setter;import java.util.ArrayList;
import java.util.Comparator;public class test4 {public static void main(String[] args) {//创建对象Person p1 = new Person(1, 18, "Java");Person p2 = new Person(2, 22, "MySQL");Person p3 = new Person(3, 6, "Redis");//添加到集合ArrayList<Person> list = new ArrayList<>();list.add(p1);list.add(p2);list.add(p3);//使用Comparator匿名类list.sort(new Comparator<Person>() {@Overridepublic int compare(Person p1, Person p2) {//升序return p1.getAge()-p2.getAge();}});//打印集合信息for (Person p : list) {System.out.println(p.getName() + ": " + p.getAge());}}
}@Getter
@Setter
class Person {private int id;private int age;private String name;public Person(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}
}

运行结果:

Redis: 6
Java: 18
MySQL: 22

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

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

相关文章

OpenCV基础知识(7)— 腐蚀与膨胀

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。腐蚀和膨胀是图像形态学中的两种核心操作&#xff0c;通过这两种操作可以清除或者强化图像中的细节。本节课就对OpenCV中的腐蚀和膨胀操作进行详细的介绍。&#x1f308; 前期回顾&#xff1a; OpenCV基础知识&#xff08;…

记录--为什么要使用 package-lock.json?

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 随着JavaScript在现代软件开发中的日益重要地位&#xff0c;Node.js生态系统中的npm成为了不可或缺的工具。在npm管理依赖的过程中&#xff0c;package-lock.json文件的作用日益凸显。本文将深入…

LeetCode108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 一、题目 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&#x…

Linux 网络编程 和 字节序的概念

网络编程概述 不同于之前学习的所有通讯方法&#xff0c;多基于Linux内核实现&#xff0c;只能在同一个系统中不同进程或线程间通讯&#xff0c;Linux的网络编程可以实现真正的多机通讯&#xff01; 两个不相关的终端要实现通讯&#xff0c;必须依赖网络&#xff0c;通过地址…

【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)

阅读导航 前言一、继承的概念及定义1. 继承的概念2.继承的定义⭕定义格式⭕继承关系和访问限定符⭕继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承⭕单…

Web安全测试(一):HTTP请求详解

一、前言 结合内部资料,与安全渗透部门同事合力整理的安全测试相关资料教程,全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试,覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬! 全部文章请访问专栏:《全栈安全测试教程(0基…

软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章二

软考高级系统架构设计师系列之:论文典型试题写作要点和写作素材总结系列文章二 一、论基于DSSA的软件架构设计与应用1.论文题目2.写作要点和写作素材二、论信息系统建模方法1.论文题目2.写作要点和写作素材三、论高可靠性系统中软件容错技术的应用1.论文题目2.写作要点和写作素…

4.物联网LWIP之C/S编程,stm32作为服务器,stm32作为客户端,代码的优化

LWIP配置 服务器端实现 客户端实现 错误分析 一。LWIP配置&#xff08;FREERTOS配置&#xff0c;ETH配置&#xff0c;LWIP配置&#xff09; 1.FREERTOS配置 为什么要修改定时源为Tim1&#xff1f;不用systick&#xff1f; 原因&#xff1a;HAL库与FREERTOS都需要使用systi…

《基于 Vue 组件库 的 Webpack5 配置》4. 压缩 CSS 和 js 文件

压缩 CSS 使用 webpack 插件 css-minimizer-webpack-plugin&#xff0c;需要额外安装 npm i css-minimizer-webpack-pluginlatest -D&#xff1b;压缩 js 使用 webpack 自带插件 terser-webpack-plugin&#xff0c;无需额外安装&#xff1b;package.json 的配置如下 const Css…

深度学习入门教学——二分分类

1、什么是二分分类&#xff1f; 二分分类就是判断“有”和“没有”、“是”和“不是”的问题&#xff0c;也就是监督学习中的分类问题。例如&#xff0c;输入一张图片&#xff0c;输出识别该图片的标签。计算机输入图片转化过程如下&#xff1a; 2、神经网络常用符号表示 (x, …

蓝蓝设计UI设计公司-界面设计与开发案例

天津航天中为项目 中国南方电网十二个软件交互优化和界面设计 图标设计 | 交互设计 | 界面设计 天津航天中为数据系统科技有限公司是航天503所控股的专业化公司&#xff0c;坐落于天津滨海新区航天技术产业园&#xff0c;是航天五院家入住天津未来科技城的军民融合型企业&…

Qt文件系统操作和文件的读写

一、文件操作类概述 QIODevice&#xff1a;所有输入输出设备的基础类 QFile&#xff1a;用于文件操作和文件数据读写的类QSaveFile&#xff1a;用于安全保存文件的类QTemporaryFile&#xff1a;用于创建临时文件的类QTcpSocket和QUdpSocket&#xff1a;分别实现了TCP和UDP的类…

git配置代理(github配置代理)

命令行配置代理方式一git config --global http.proxy http://代理服务器地址:端口号git config --global https.proxy https://代理服务器地址:端口号如果有用户名密码按照下面命令配置 git config --global http.proxy http://用户名:密码代理服务器地址:端口号git config --…

解决问题:C++ [某变量名] was not declared in this scope

目录 程序报错的问题 查看程序问题 发现错误代码 错误原因 修改代码 再次运行 程序报错的问题 查看程序问题 发现错误代码 cout<<c; 错误原因 c 这个变量还没有在这个程序中定义 修改代码 加上 int c; 再次运行

使用Dockerfile部署java项目

1、移动java包到创建的目录下 2、编写Dockerfile文件 在同一目录下使用如下命令创建文件 touch Dockerfile 文件内容如下&#xff1a; #依赖的父镜像 FROM java:8 #作者 MAINTAINER maxurui #jar包添加到镜像中 ADD springboot3-0.0.1-SNAPSHOT.jar springboot3-0.0.1-SNAPSHO…

go gorm创建记录

创建model package mysqltestimport ("errors""fmt""gorm.io/gorm" )type Product struct {gorm.ModelID uint gorm:"primarykey"Name string gorm:"column:name"Price float64 gorm:"column:price_value&quo…

LeetCode字符串数组最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”] 输出&#xff1a;“fl” 示例 2&#xff1a; 输入&#xff1a;strs [“dog”,“raceca…

SOPC之NIOS Ⅱ实现电机转速PID控制(调用中断函数)

通过FPGA开发板上的NIOS Ⅱ搭建电机控制的硬件平台&#xff0c;包括电机正反转、编码器的读取&#xff0c;再通过软件部分实现PID算法对电机速度进行控制&#xff0c;使其能够渐近设定的编码器目标值。 一、问题与改进 SOPC之NIOS Ⅱ实现电机转速PID控制_STATEABC的博客-CSDN…

关于Optix v6和Optix v7之间的种种区别

目录 Optix v6 基本构成组件 射线与求交 纹理 三角Mesh Optix v7结构 基本构成组件 管线 着色器绑定表(SBT) 第一个例子 第二个例子 全局光照(GI)有很多种解决方案&#xff0c;比如VXGI、Lumen、DDGI、SSGI、IBL、PRT、SurfelsGI等&#xff0c;其中&#xff0c;越来…

k8s-ingress-context deadline exceeded

报错&#xff1a; rancher-rke-01:~/rke # helm install rancher rancher-latest/rancher --namespace cattle-system --set hostnamewww.rancher.local Error: INSTALLATION FAILED: Internal error occurred: failed calling webhook "validate.nginx.ingress.kube…