Java中Comparable和Comparator有什么区别?

news/2025/1/16 4:43:33/

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.ppmy.cn/news/1060256.html

相关文章

题解:ABC279D-Freefall

题解&#xff1a;ABC279D-Freefall 题目 链接&#xff1a;Atcoder。 链接&#xff1a;洛谷。 难度 算法难度&#xff1a;C。 思维难度&#xff1a;A。 调码难度&#xff1a;C。 综合评价&#xff1a;普及/提高。 算法 模拟。 思路 引入3个数组&#xff1a;u&#x…

小程序微信营销活动策划成功的关键因素

随着移动互联网的发展&#xff0c;小程序已经成为许多企业进行数字化营销的重要渠道之一。而在小程序内开展微信营销活动&#xff0c;是提升用户参与度、增强品牌影响力的有效方法。然而&#xff0c;要使这些活动取得成功&#xff0c;需要考虑诸多因素。本文将深入探讨小程序微…

No message found under code ‘-1‘ for locale ‘zh_CN‘.

导出中的报错&#xff1a;No message found under code -1 for locale zh_CN. 报错原因&#xff1a;页面中展示的数据和后端excel中的数据不一致导致 具体原因&#xff1a;

从零学算法2830

2830.给你一个整数 n 表示数轴上的房屋数量&#xff0c;编号从 0 到 n - 1 。 另给你一个二维整数数组 offers &#xff0c;其中 offers[i] [starti, endi, goldi] 表示第 i 个买家想要以 goldi 枚金币的价格购买从 starti 到 endi 的所有房屋。 作为一名销售&#xff0c;你需…

CRUD啥也不会的高狗剩

xml resultType MyBatis查询结果resultType返回值类型详细介绍_留兰香丶的博客-CSDN博客 Mapper Service List<Map<String,String>>遍历方法 List&#xff1c;Map&#xff1c;String, String&#xff1e;&#xff1e;遍历的方法_list<map<string,string&…

day-30 代码随想录算法训练营 回溯part06

332.重新安排行程 思路&#xff1a;使用unordered_map记录起点机场对应到达机场&#xff0c;内部使用map记录到达机场的次数&#xff08;因为map会进行排序&#xff0c;可以求出最小路径&#xff09; class Solution { public:vector<string>res;unordered_map<stri…

KiCad 已经打开 交错保存 错误

期望结果&#xff1a; 打开工程 .pro 文件后&#xff0c;双击工程文件列表中的的 原理图&#xff1a;*.kicad_sch 能够打开原理图。 实际结果&#xff1a; 打开工程 .pro 文件后&#xff0c;双击工程文件列表中的的 原理图&#xff0c;弹出错误提示框如下&#xff1a; 重现步…

linux————keepalived+LVS(DR模式)

一、作用 使用keepalived解决LVS的单点故障 高可用集群 二、 调度器配置 环境 两台LVS服务 一主一备 两台web服务 采用nginx &#xff08;实现LVS负载均衡&#xff09; 服务ip 主LVS 192.168.100.3 备LVS 192.168.100.6 web1 192.…