Java Comparable及Comparator接口区别详解
作者:等你的夏天 发布时间:2023-07-03 08:19:50
在实际应用中,我们往往有需要比较两个自定义对象大小的地方。而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的。所以Java中要比较对象的大小或者要对对象的集合进行排序,需要通过比较这些对象的某些属性的大小来确定它们之间的大小关系。
一般,Java中通过接口实现两个对象的比较,比较常用就是Comparable接口和Comparator接口。首先类要实现接口,并且使用泛型规定要进行比较的对象所属的类,然后类实现了接口后,还需要实现接口定义的比较方法(compareTo方法或者compare方法),在这些方法中传入需要比较大小的另一个对象,通过选定的成员变量与之比较,如果大于则返回1,小于返回-1,相等返回0。
一般简单的回答可以这么说:
1)首先这两个接口一般都是用来实现集合内的排序,comparable还可以用于两个对象大小的比较。
2)Comparable接口在java.lang包下面。里面有一个compareTo(T)接口方法。当一个类需要比较的时候,需自行实现Comparable接口的CompareTo方法。当调用集合排序方法的时候,就会调用对象的compareTo()方法来实现对象的比较。
3)Comparator接口在java.util包下面。Comparator是一个比较器接口,一般单独定义一个比较器实现该接口中的比较方法compare();在集合sort方法中传入对应的比较器实现类。一般使用匿名内部类来实现比较器。
4)Comparator相对于Comparable来说更加的灵活,耦合度低。
首先呢,我们可以先了解一下List是如何排序的,我通过写一个例子来说明;
先写一个实体类;
public class User {
private String name;
private Integer age;
public static void main(String[] args) {
List<User> users=new ArrayList<>();
users.add(new User("yao",19));
users.add(new User("zhang",20));
users.add(new User("li",17));
users.add(new User("xu",15));
users.add(new User("xupeng",15));
users.sort(new UserComparator());
System.out.println(users);
}
public User(){
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
再写一个实现比较器接口的类方法;
/**
* 实现比较器接口,并重写compare方法
*/
public class UserComparator implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
int age=o1.getAge()- o2.getAge();
return age!=0?age:o1.getName().length()-o2.getName().length();
}
}
最后,我们的测试结果是这样的,说明成功了;
一、Comparable接口
1)什么是Comparable接口:
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。
2)实现什么方法:
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
参数: o - 要比较的对象。
返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。
3)实例(注:代码基本上只改动我圈出来的即可测试,其它的照List排序的元代码使用即可测试出结果):
当前对象 this与传入的其他对应的比较方法时;
二、Comparator接口
1)实例说明:
Comparator接口与Comparable接口不同的是:
①Comparator位于包java.util下,而Comparable位于包java.lang下。
②Comparable接口将比较代码嵌入需要进行比较的类的自身代码中,而Comparator接口在一个独立的类中实现比较。
③comparator接口相对更灵活些,因为它跟接口实现的类是耦合在一起的,可以通过换比较器来换不同的规则进行比较,即如果前期类的设计没有考虑到类的Compare问题而没有实现Comparable接口,后期可
以通过Comparator接口来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。
④Comparable接口强制进行自然排序,而Comparator接口不强制进行自然排序,可以指定排序顺序。
⑤换一种说法,简单的说:
Comparable:使user类具有自比较的能力,可以让自己跟同类型的数据做比较;
Comparator:就是一个比较器,像一个第三方,传入两个对象,让比较器去判断谁大谁小;
来源:https://www.cnblogs.com/xie-qi/p/13090565.html


猜你喜欢
- 在C语言中,函数名可以当做函数指针传递给形参从而实现回调void f1() { printf("f1()\n"); }v
- 本文实例为大家分享了C#添加读取Word脚注尾注的具体代码,供大家参考,具体内容如下脚注和尾注是对文本的补充说明。脚注一般位于页面的底部,可
- 在android提供了一种类型:Parcel。被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。 除了基本类型以外,只有实
- JWT本文代码截取自实际项目。jwt(Json Web Token),一个token,令牌。简单流程:用户登录成功后,后端返回一个token
- C#编写一个简易计算器,供大家参考,具体内容如下界面代码using System;using System.Collections.Gene
- 本篇文章主要介绍了java自动生成编号的实现,分享给大家,具体如下/** * 自动生成编号格式:yyMM+四位流水号 */ @Reques
- 一、前言随着互联网项目前后端分离方式的流行,前端与后端交给不同的人员开发,项目沟通成本也随之提高。主要表现在WebAPI接口的沟通,Swag
- 目录无SpringMVC全局异常时的流程图SpringMVC全局异常流程图其实是一个ModelAndView对象配置文件applicatio
- 有项目需求需要绘制多个圆圈,并且使用连续的数字对其排列起来,也就是好多排的圆圈。首先看一下效果图:一排设置为8个,一共有53个的:一排设值为
- 本文章向大家介绍JAVA爬取天天基金网数据,主要包括JAVA爬取天天基金网数据使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参
- Android安全加密专题文章索引Android安全加密:对称加密Android安全加密:非对称加密Android安全加密:消息摘要Mess
- C#Windows server2016服务器搭建NFS共享文件夹与C#上传图片到共享文件夹nfs共享文件夹实现步骤基于:Windows s
- 这篇文章主要介绍了Springboot如何设置静态资源缓存一年,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 一、项目简述功能包括(管理员和游客角色):1:用户及主要操作功能 游客可以浏览网站的主页,但是需要注册为会员后部分小 说才能对网络小说进免费
- 本文实例讲述了Java截取字符串的方法。分享给大家供大家参考。具体实现方法如下:public static void main(String
- 类加载器java中的类并不是一次加载完成的,而是按需加载。类加载器是用于加载java类到java虚拟机中的组件,它负责读取java字节码,并
- 今天收到了Android Studio3.0更新推送,在升级过程中遇到几个问题,在这里把问题和解决方法记录下,方便要升级的童鞋。如果还有童
- 引言因为写了不少 Spring Security 文章的缘故,所以总是有小伙伴来问松哥:按钮级别的权限怎么实现?甚至有一些看过 vhr 的小
- 在计算机科学中,正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被
- 目录PdfSharp下载涉及知识点文档示例图核心代码PdfSharp一款开源的用于创建,操作PDF文档的.Net类库,本文以一个简单的小例子