Java compare compareTo方法区别详解

server/2024/9/24 13:32:44/

compareTo

  • compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接口的,必须重写public int compareTo(T o)方法。

  • 它强行将实现它的每一个类的对象进行整体排序——称为该类的自然排序,实现此接口的对象列表和数组可以用Collections.sort()和Arrays.sort()进行自动排序。

  • 也就是说,只要实现了这个接口的对象(数组)就相当于有了排序的能力,所以叫做comparable——可排序的,所以可以说这是一种内部排序的方式,

  • 比如Hadoop中的MapReduce,Map函数和Reduce函数处理的 <key,value>,其中需要根据key对键值对进行排序,所以,key实现了WritableComparable<T>接口,实现这个接口可同时用于序列化和反序列化。WritableComparable<T>接口(用于序列化和反序列化)是Writable接口和Comparable<T>接口的组合;

compare

  • compare(Object o1, Object o2)方法是java.util.Comparator<T>接口的方法,它实际上用的是待比较对象的compareTo(Object o)方法

  • 对于它,则是针对一些本身没有比较能力的对象(数组)为它们实现比较的功能,所以它叫做比较器,是一个外部的东西,通过它定义比较的方式,再传到Collection.sort()和Arrays.sort()中对目标排序,而且通过自身的方法compare()定义比较的内容和结果的升降序;

代码实现对比

下面我们写一来看看上面两个方法是怎么用的:

首先,写一个User类,代码如下:

java">public class User implements Comparable<Object>{int id;String name;public User(int id,String name){this.id = id;this.name = name;}/** Getters and Setters*/public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic int compareTo(Object o){if(this == o){return 0;}else if(o!=null&&o instanceof User){User u = (User)o;if(id <= u.id){return -1;}else{return 1;}}else{return -1;}}
}

接下来,我们写一个测试类Test:

java">public class Test{//编写Comparator,根据User的id对User进行排序private static final Comparator<User> COMPARATOR = new Comparator<User>(){public int compare(User o1, User o2){return o1.compareTo(o2);//运用User类的compareTo方法比较两个对象  }  };public static void main(String[] args){ArrayList<User> student = new ArrayList<User>();User user1 = new User(1,"ally");User user2 = new User(2,"ally");Collections.sort(student, COMPARATOR);//用我们写好的Comparator对student进行排序for(int i=0;i<student.size();i++){System.out.println(student.get(i).getId());}}
}

总结:Comparable<Object> 是一个接口,里面有一个排序的方法 compareTo(Object o){},要使得某个对象是可以排序的,那么这个对象必须必须实现这个接口,因为两个对象之间的排序,调用调用的比较方法,就是compareTo()方法。

Comparator<T>接口,是一个接口,里面的方法是compare(o1,o2) 它可以对o1,o2进行排序,在这里面你就可以调用o1对象的compareTo方法排序了。


http://www.ppmy.cn/server/5303.html

相关文章

N-149基于微信小程序网上商城系统

开发工具&#xff1a;IDEA、微信小程序 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 前端技术&#xff1a;vue、uniapp 服务端技术&#xff1a;springbootmybatisredis 本系统分微信小程序和管理后台两部分&a…

密码学 | 椭圆曲线密码学 ECC 入门(四)

目录 正文 1 曲线方程 2 点的运算 3 求解过程 4 补充&#xff1a;有限域 ⚠️ 知乎&#xff1a;【密码专栏】动手计算双线性对&#xff08;中&#xff09; - 知乎 ⚠️ 写在前面&#xff1a;本文属搬运博客&#xff0c;自己留着学习。注意&#xff0c;这篇博客与前三…

● State Schema Evolution的平滑迁移策略

State Schema Evolution指的是在分布式系统或数据库中&#xff0c;随着业务需求的发展和变化&#xff0c;需要对存储的状态&#xff08;如数据库表结构、数据模型等&#xff09;进行升级或调整的过程。平滑迁移策略的目标是在不影响系统正常运行、尽量减少服务中断时间的前提下…

Rust---#[derive(Debug)]

在 Rust 中,#[derive(Debug)] 宏用于自动为结构体或枚举实现 Debug trait。Debug trait 允许一个类型的实例被格式化为字符串,通常用于调试输出。以下是 #[derive(Debug)] 通常的使用方式: 目录 定义结构体或枚举使用 println! 宏打印调试信息在自定义 Debug 实现中使用定义…

【LeetCode热题100】【动态规划】最长递增子序列

题目链接&#xff1a;300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 让dp[i]是以nums[i]为结尾的子序列的最长递增长度&#xff0c;遍历nums[i]之前的元素&#xff0c;如果有比nums[i]小的&#xff0c;说明递增子序列可以延申 class Solution { public:int le…

第17天:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

第十七天 本课意义 1.CMS识别到后期漏洞利用和代码审计 2.开发框架识别到后期漏洞利用和代码审计 3.开发组件识别到后期漏洞利用和代码审计 一、CMS指纹识别-不出网程序识别 1.概念 CMS指纹识别一般能识别到的都是以PHP语言开发的网页为主&#xff0c;其他语言开发的网页识…

Mac电脑上有什么好玩的格斗游戏 《真人快打1》可以在苹果电脑上玩吗

你是不是喜欢玩格斗游戏&#xff1f;你是不是想在你的Mac电脑上体验一些刺激和激烈的对战&#xff1f;在这篇文章中&#xff0c;我们将介绍Mac电脑上有什么好玩的格斗游戏&#xff0c;以及《真人快打1》可以在苹果电脑上玩吗。 一、Mac电脑上有什么好玩的格斗游戏 格斗游戏是…

python操作数据库

1 关系型数据库ORM SQLAlchemy 安装 pip install SQLAlchemy 优点&#xff1a; 易用 损耗小 可移植性强 1.1 环境整备 安装插件 pip install mysqlclient 创建数据库 create database db1; 创建数据表 create table user( id int(10), name varchar(20), email varchar…