前言

就是普普通通的写这么一篇文章,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接口的比较相关推荐

  1. Comparable接口和Comparator接口的比较

    1.Comparable详解 1.1Comparable概述 来自java.lang.Comparable.Comparable是 排序接口.若一个类实现了Comparable接口,就意味着该类支持排 ...

  2. Comparable接口和Comparator接口

    目录 1 介绍 2 Comparable接口 3 Comparator接口 4 总结 1 介绍 有这样2个人,一个人光头,一个人有黑色头发,现在不允许染发,只允许光头的带假发,理由是有头发的人没有必要 ...

  3. Java6.0中Comparable接口与Comparator接口详解

    Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者 ...

  4. 深入理解 Comparable 接口和 Comparator 接口以及Arrays.sort()

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

  5. Comparable接口和Comparator接口的使用和区别

    Comparable Comparable接口在JDK8中的源码: package java.lang; import java.util.*;package java.lang; public in ...

  6. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础 - 进阶继承,抽象类,接口 进阶继承 class Stu {int age = 1; } class Stuo extends Stu {int agee = 2; } class ...

  7. Java 中类的比较与排序方法(应用Comparable接口与Comparator接口)通俗易懂

    引言 在平时写Java的程序的时候,如果要进行一些基本类型的变量的比较,可以很方便得调用Math.max().Math.min()等方法,如果要对数组或者列表进行排序,也可以用Arrays.sort( ...

  8. java实现Comparable接口和Comparator接口,并重写compareTo方法和compare方法

    原文地址https://segmentfault.com/a/1190000005738975 实体类:java.lang.Comparable(接口) + comareTo(重写方法),业务排序类 ...

  9. Java中Comparable接口和Comparator接口怎么用?

    Java比较器 文章目录 Java比较器 Comparable接口(自然排序) Comparator接口(定制排序) 引文:Java中的对象,正常情况下是不可以用>和<去比较的,只能使用不 ...

最新文章

  1. 我不是人:一年发论文180篇,横跨多个学科领域,收获99次引用
  2. LeetCode 42. Trapping Rain Water--算法题--c++解法
  3. Dr. Evil Underscores(异或最大值最小)
  4. SAP BW系统日常维护日常工作及常见的Infopackage错误
  5. jaxb xsd生成xml_使用JAXB和Jackson从XSD生成JSON模式
  6. win10切换输入法快捷键_输入法失灵怎么办?该怎么恢复?
  7. 一款App基于mPaaS小程序如何进行改造?
  8. python 弹出对话框_python+selenium 抓取弹出对话框信息
  9. emui内核支持kvm吗_KVM虚拟化详解
  10. linux io测试陈旭,130242014076+陈旭+第2次实验(示例代码)
  11. pandas 散布矩阵
  12. android 无损分区,有什么可行办法把安卓4.4用的tf卡第一个分区从fat32无损转换成ext4?...
  13. 计算机博弈 基础算法 阿尔法-贝塔剪枝算法 α-β剪枝算法
  14. USRP_X310_Device_Recovery手册
  15. 孙溟㠭先生书画艺术《贵妃》
  16. java求最短距离_计算多点之间的最短距离
  17. 数据中心中交换机的转发原理 ---尚文网络奎哥
  18. 测试3d游戏pfs的软件,Beepa Fraps(3D游戏测帧录制软件)
  19. 收藏的技术博客链接(不断更新)
  20. 在云中实现可信的Luna SA解决方案

热门文章

  1. keil git 编译文件_keil下的STM32程序开发部署(一)
  2. CUDA学习-函数前缀__global__
  3. c#split方法拆分为数据_Dexplot:基于pandas,比matplotlib更简单的数据可视化和数据分析工具...
  4. 如何在geth中创建genesis.json_如何在Photoshop中应用“通道混合器”创建一个复古韵味色调...
  5. linux vg 镜像,Linux下载_Linux系统各种版本ISO镜像下载(redhat,centos,oracle,ubuntu,openSUSE)...
  6. 又见奇葩乘客!醉酒男子与人发生冲突迫使飞机返航
  7. 【Interfacenavigation】用RecyclerView创建一个列表(4)
  8. 【C#】list 去重
  9. openlayers 根据style设置显示级别并在字体加背景框
  10. 学习Key与Value的集合hashtable