文章内容参考博客:https://www.cnblogs.com/xujian2014/p/5215082.html

1.Comparable

Comparable是排序接口,当一个类实现了Comparable接口后,就以为着该类支持排序。实现了Comparable接口的类,其组成的数组和列表就可以通过Collections的工具进行自动排序。

而实现了Comparable接口的对象也可以用作有序映射(LinkedHashMap)中的键,或者有序集合中的集合,无序指定比较器Comparator。

public class Person implements Comparable<Person> {
private String name;
private int id;
private int age; public String getName(){return name;}
public int getId(){ return id;}
public int getAge(){return age;}
public void setName(String name){this.name=name;}
public void setId(int id){this.id=id;}
public void setAge(int age){this.age = age;} @Override
public int compareTo(Person p) {
if(age<p.getAge())
return 1;
else
return -1;
}
}

你可以在重写的compareTo方法中实现更加复杂的比较,而返回的值决定其是升序还是降序,具体如下:

返回值 A>B A<B
return 1 升序   降序
return -1 降序 升序

此时实现一个Person的表

 List<Person> list = new ArrayList<>();

        for(int i = 0; i<10; i++ ){
Person person = new Person();
person.setId(i);
person.setName("person-"+i);
person.setAge(i*5);
list.add(person);
}

调用Collections.sort结果为:降序

[Name=hero-9,Id=9,Age=45], [Name=hero-8,Id=8,Age=40], [Name=hero-7,Id=7,Age=35], [Name=hero-6,Id=6,Age=30], [Name=hero-5,Id=5,Age=25], [Name=hero-4,Id=4,Age=20]

如果改变在Person中重写的compareTo的返回值,则结果为 升序

[Name=hero-0,Id=0,Age=0], [Name=hero-1,Id=1,Age=5], [Name=hero-2,Id=2,Age=10], [Name=hero-3,Id=3,Age=15], [Name=hero-4,Id=4,Age=20], [Name=hero-5,Id=5,Age=25], [Name=hero-6,Id=6,Age=30]

2.Comparator

Comparator是比较器接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。

我们可以直接创建一个比较器,然后来重写其比较方法:

Comparator<Person> cp = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return 0;
}
};

或者创建一个比较器类,实现Comparator接口,重写其中的方法,并在Collections.sort()中调用:

public class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person o1,Person o2) {
return 0;
}
}

3.两者的区别

Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

  Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

  两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

集合-Comparator和Comparable的更多相关文章

  1. Java集合中Comparator和Comparable接口的使用

    在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...

  2. 集合排序 Comparator和Comparable的使用区别

    Java 排序 Compare  Comparator接口 Comparable接口 区别 在Java中使用集合来存储数据时非常常见的,集合排序功能也是常用功能之一.下面看一下如何进行集合排序,常用的 ...

  3. Java集合排序方法comparable和comparator的总结

    一.概述Comparable和Comparator都是用来实现集合中元素的比较.排序的.Comparable是在集合内部定义的方法实现的排序,位于java.lang下.Comparator是在集合外部 ...

  4. Java://Comparator、Comparable的用法(按照要求将set集合的数据进行排序输出):

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; //comparator. ...

  5. Java自学-集合框架 Comparator和Comparable

    Java Comparator和Comparable 步骤 1 : Comparator 假设Hero有三个属性 name,hp,damage 一个集合中放存放10个Hero,通过Collection ...

  6. 【原】Comparator和Comparable的联系与区别

    1.知识点了解 Comparator和Comparable都是用用来实现集合中元素的比较.排序的,所以,经常在集合外定义Comparator接口的方法和集合内实现Comparable接口的方法中实现排 ...

  7. java之Comparator与Comparable

    转自:http://blog.csdn.net/zhangerqing 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定 ...

  8. java的Comparator和Comparable

    java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序.      ...

  9. Comparator与Comparable用法与区别

    一.概述.   Comparator和Comparable两者都属于集合框架的一部分,都是用来在对象之间进行比较的,但两者又有些许的不同,我们先通过一个例子来看一下他们的区别,然后再分别学习下它们的源 ...

随机推荐

  1. Linux实战教学笔记49:Zabbix监控平台3.2.4(一)搭建部署与概述

    https://www.cnblogs.com/chensiqiqi/p/9162986.html 一,Zabbix架构 zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企 ...

  2. 如何用php实现分页效果

    分页效果在网页中是常见的,可是怎样才能实现分页呢,今天做了两种方法来实现一下分页的效果 首先,我们需要准备在数据库里面准备一个表,并且插入数据,这些都是必需的前提工作了,不多说,如图所示(库名为jer ...

  3. C# — 创建Windows服务进阶版

    1.新建一个Windows服务项目:FaceService 2.将service1.cs重命名为FaceService.cs,然后在主界面右击鼠标,选择添加安装程序 3.鼠标选择serviceInst ...

  4. jQuery 图片查看插件 Magnify 开发简介(仿 Windows 照片查看器)

    前言 因为一些特殊的业务需求,经过一个多月的蛰伏及思考,我开发了这款 jQuery 图片查看器插件 Magnify,它实现了 Windows 照片查看器的所有功能,比如模态窗的拖拽.调整大小.最大化, ...

  5. 定制json序列化

    最近有人问我怎么定制一个json序列化,使序列化的时候只写出声明的父类成员,而不要把实际子类的成员写出来.当然,序列化用的是大家用的最多的json.net. 简单的说,这是个契约怎么解析的问题,jso ...

  6. jdbc,mybatis,hibernate各自优缺点及区别

    先比较下jdbc编程和hibernate编程各自的优缺点.    JDBC:    我们平时使用jdbc进行编程,大致需要下面几个步骤:    1,使用jdbc编程需要连接数据库,注册驱动和数据库信息 ...

  7. 有关python2与python3中关于除的不同

    有关python2与python3中关于除的不同 python中2版本与3版本关于除的处理还是有一些差异的. 在python 2.7.15中除(/)是向下取整的,即去尾法. 123/10 # 结果 1 ...

  8. 第二部分之AOF持久化(第十一章)

    AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的.被写入AOF文件的所有命令都是以Redis的命令请求协议格式(纯文本)保存的. 一,AOF持久化的实现 1.命令追加 当AOF持 ...

  9. Pyspark 使用 Spark Udf 的一些经验

    起初开始写一些 udf 的时候感觉有一些奇怪,在 spark 的计算中,一般通过转换(Transformation) 在不触发计算(Action) 的情况下就行一些预处理.udf 就是这样一个好用的东 ...

  10. Web App架构

    Web App 架构分为两种:一种是工程架构,一种是项目架构. 工程架构则主要有以下几个方面的内容: 1, 解放生产力,我们希望在开发项目的过程中把全部目光都放到书写业务代码上,不需要去考虑一些重复性 ...