Java基础之Comparable接口和Comparator接口的比较
前言
就是普普通通的写这么一篇文章,java集合类估计java程序猿都知道,那就写一点小众的。
在实际应用中,我们往往有需要比较两个自定义对象大小的地方。而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义的对象进行比较的。
一般,Java中通过接口实现两个对象的比较,常用的就是Comparable接口和Comparator接口。首先类要实现接口,并且使用泛型规定要进行比较的对象所属的类,然后类实现了接口后,还需要实现接口定义的比较方法(compareTo方法或者compare方法),在这些方法中传入需要比较大小的另一个对象,通过选定的成员变量与之比较,如果大于则返回1,小于返回-1,相等返回0。
一:Comparable接口
1、什么是Comparable接口
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。
2、实现什么方法
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
参数: o - 要比较的对象。
返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。
3、实例
public class UserInfo implements Comparable<UserInfo> {private int id;private String name;private int age;public UserInfo(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}@Overridepublic int compareTo(@NonNull UserInfo o) {return age > o.age ? 1 : (age == o.age ? 0 : -1);}@Overridepublic String toString() {return "UserInfo[id=" + id + " name=" + name + " age=" + age + "]";}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;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
测试类
public class InterTest {public static void main(String[] args) {List<UserInfo> userInfoList = new ArrayList<>();userInfoList.add(new UserInfo(0, "大强", 12));userInfoList.add(new UserInfo(1, "大黄", 18));userInfoList.add(new UserInfo(2, "大黑", 16));userInfoList.add(new UserInfo(0, "大白", 52));userInfoList.add(new UserInfo(0, "大红", 8));userInfoList.add(new UserInfo(0, "大花", 16));userInfoList.add(new UserInfo(0, "大菜", 36));System.out.println("排序前");for (UserInfo userInfo : userInfoList) {System.out.println(userInfo);}Collections.sort(userInfoList);System.out.println("排序后");for (UserInfo userInfo : userInfoList) {System.out.println(userInfo);}}}
输出
排序前UserInfo[id=0 name=大强 age=12]UserInfo[id=1 name=大黄 age=18]UserInfo[id=2 name=大黑 age=16]UserInfo[id=0 name=大白 age=52]UserInfo[id=0 name=大红 age=8]UserInfo[id=0 name=大花 age=16]UserInfo[id=0 name=大菜 age=36]排序后UserInfo[id=0 name=大红 age=8]UserInfo[id=0 name=大强 age=12]UserInfo[id=2 name=大黑 age=16]UserInfo[id=0 name=大花 age=16]UserInfo[id=1 name=大黄 age=18]UserInfo[id=0 name=大菜 age=36]UserInfo[id=0 name=大白 age=52]
二、Comparator接口
与上面的Comparable接口不同的是:
- Comparator位于包java.util下,而Comparable位于包java.lang下。
- Comparable接口将比较代码嵌入需要进行比较的类的自身代码中,而Comparator接口在一个独立的类中实现比较。
如果前期类的设计没有考虑到类的Compare问题而没有实现Comparable接口,后期可以通过Comparator接口来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。
Comparable接口强制进行自然排序,而Comparator接口不强制进行自然排序,可以指定排序顺序。
实例:
public class UserInfo {private int id;
private String name;
private int age;public UserInfo(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}@Overridepublic String toString() {return "UserInfo[id=" + id + " name=" + name + " age=" + age + "]";}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;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}public class InterTest {public static void main(String[] args) {List<UserInfo> userInfoList = new ArrayList<>();userInfoList.add(new UserInfo(0, "大强", 12));userInfoList.add(new UserInfo(1, "大黄", 18));userInfoList.add(new UserInfo(2, "大黑", 16));userInfoList.add(new UserInfo(0, "大白", 52));userInfoList.add(new UserInfo(0, "红红", 8));userInfoList.add(new UserInfo(0, "翠花", 16));userInfoList.add(new UserInfo(0, "芹菜", 36));System.out.println("排序前");for (UserInfo userInfo : userInfoList) {System.out.println(userInfo);}Collections.sort(userInfoList, new Comparator<UserInfo>() {@Overridepublic int compare(UserInfo o1, UserInfo o2) {return o1.getAge() > o2.getAge() ? 1 : (o1.getAge() == o2.getAge() ? 0 : -1);}
});System.out.println("排序后");for (UserInfo userInfo : userInfoList) {System.out.println(userInfo);}}}
输出:
//排序前UserInfo[id=0 name=大强 age=12]UserInfo[id=1 name=大黄 age=18]UserInfo[id=2 name=大黑 age=16]UserInfo[id=0 name=大白 age=52]UserInfo[id=0 name=红红 age=8]UserInfo[id=0 name=翠花 age=16]UserInfo[id=0 name=芹菜 age=36]//排序后UserInfo[id=0 name=大红 age=8]UserInfo[id=0 name=大强 age=12]UserInfo[id=2 name=大黑 age=16]UserInfo[id=0 name=翠花 age=16]UserInfo[id=1 name=大黄 age=18]UserInfo[id=0 name=芹菜 age=36]UserInfo[id=0 name=大白 age=52]
Java基础之Comparable接口和Comparator接口的比较相关推荐
- Comparable接口和Comparator接口的比较
1.Comparable详解 1.1Comparable概述 来自java.lang.Comparable.Comparable是 排序接口.若一个类实现了Comparable接口,就意味着该类支持排 ...
- Comparable接口和Comparator接口
目录 1 介绍 2 Comparable接口 3 Comparator接口 4 总结 1 介绍 有这样2个人,一个人光头,一个人有黑色头发,现在不允许染发,只允许光头的带假发,理由是有头发的人没有必要 ...
- Java6.0中Comparable接口与Comparator接口详解
Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...
- 深入理解 Comparable 接口和 Comparator 接口以及Arrays.sort()
compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接 ...
- Comparable接口和Comparator接口的使用和区别
Comparable Comparable接口在JDK8中的源码: package java.lang; import java.util.*;package java.lang; public in ...
- 第二十八节:Java基础-进阶继承,抽象类,接口
前言 Java基础 - 进阶继承,抽象类,接口 进阶继承 class Stu {int age = 1; } class Stuo extends Stu {int agee = 2; } class ...
- Java 中类的比较与排序方法(应用Comparable接口与Comparator接口)通俗易懂
引言 在平时写Java的程序的时候,如果要进行一些基本类型的变量的比较,可以很方便得调用Math.max().Math.min()等方法,如果要对数组或者列表进行排序,也可以用Arrays.sort( ...
- java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法
原文地址https://segmentfault.com/a/1190000005738975 实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 ...
- Java中Comparable接口和Comparator接口怎么用?
Java比较器 文章目录 Java比较器 Comparable接口(自然排序) Comparator接口(定制排序) 引文:Java中的对象,正常情况下是不可以用>和<去比较的,只能使用不 ...
最新文章
- 我不是人:一年发论文180篇,横跨多个学科领域,收获99次引用
- LeetCode 42. Trapping Rain Water--算法题--c++解法
- Dr. Evil Underscores(异或最大值最小)
- SAP BW系统日常维护日常工作及常见的Infopackage错误
- jaxb xsd生成xml_使用JAXB和Jackson从XSD生成JSON模式
- win10切换输入法快捷键_输入法失灵怎么办?该怎么恢复?
- 一款App基于mPaaS小程序如何进行改造?
- python 弹出对话框_python+selenium 抓取弹出对话框信息
- emui内核支持kvm吗_KVM虚拟化详解
- linux io测试陈旭,130242014076+陈旭+第2次实验(示例代码)
- pandas 散布矩阵
- android 无损分区,有什么可行办法把安卓4.4用的tf卡第一个分区从fat32无损转换成ext4?...
- 计算机博弈 基础算法 阿尔法-贝塔剪枝算法 α-β剪枝算法
- USRP_X310_Device_Recovery手册
- 孙溟㠭先生书画艺术《贵妃》
- java求最短距离_计算多点之间的最短距离
- 数据中心中交换机的转发原理 ---尚文网络奎哥
- 测试3d游戏pfs的软件,Beepa Fraps(3D游戏测帧录制软件)
- 收藏的技术博客链接(不断更新)
- 在云中实现可信的Luna SA解决方案
热门文章
- keil git 编译文件_keil下的STM32程序开发部署(一)
- CUDA学习-函数前缀__global__
- c#split方法拆分为数据_Dexplot:基于pandas,比matplotlib更简单的数据可视化和数据分析工具...
- 如何在geth中创建genesis.json_如何在Photoshop中应用“通道混合器”创建一个复古韵味色调...
- linux vg 镜像,Linux下载_Linux系统各种版本ISO镜像下载(redhat,centos,oracle,ubuntu,openSUSE)...
- 又见奇葩乘客!醉酒男子与人发生冲突迫使飞机返航
- 【Interfacenavigation】用RecyclerView创建一个列表(4)
- 【C#】list 去重
- openlayers 根据style设置显示级别并在字体加背景框
- 学习Key与Value的集合hashtable