Comparable和Comparator有什么区别?你知道他们和Arrays.sort的关系吗?

简介: Comparable和Comparator有什么区别?你知道他们和Arrays.sort的关系吗?

Comparable 和 Comparator 的介绍


Comparable是   排序接口 ,只有一个方法 compareTo ,如果 想让一个类可以通过Arrays.sort() 方法进行排序,则可以让这个类继承Comparable接口 重写这个方法。

Comparator 是  比较接口 ,如果一个类本身不支持排序(即没有实现Comparable接口),但你又不能改动这个类,就可以写一个类(这个类又叫“比较器”) 实现Comparator接口, 然后重写Compare方法。我们想要排序的时候,就可以把这类的实例化对象传入到Arrays.sort() 这个方法里。  



什么时候使用??

Comparable :当我们自己写一个类的时候 ,可以用这个方法 实现自己想要的比较规则

Comparator  :当一个类 没有比较器 ,或者我们原本的比较器中的规则 不是我们想要的


Arrays.sort 重载的四类方法


sort( T[] a )  对指定T型数组按数字升序排序。

sort( T[] a , int formIndex , int toIndex )  对指定T型数组的指定范围按数字升序排序。

sort( T[] a , Comparator<? supre T> c )  根据指定比较器产生的顺序对指定对象数组进行排序。

sort( T[] a , int formIndex , int toIndex , Comparator<? supre T> c) 根据指定比较器产生的顺序对指定对象数组的指定对象数组进行排序。


Comarable 与 sort 代码案例


class  Student implements Comparable<Student>{
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public int compareTo(Student o) {
        return this.age - o.age;
    }
}
public class TestComparable{
    public static void main(String[] args) {
        Student[] arr = new Student[]{new Student("aa",11),
                new Student("bb",22),new Student("cc",15)};
        Arrays.sort(arr);
        for (Student student : arr) {//打印出排序的结果
            System.out.println("name:" + student.name + "  age:" + student.age);
        }
        //控制台打印结果: 我们可以看到 按照我们重写的CompareTo的规则(年龄)进行排序了
        //name:aa  age:11
        //name:cc  age:15
        //name:bb  age:22
    }
}

Comparator 与 sort 代码案例

//我们写一个实现Comparator的类,然后重写compare方法
class MyComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
}
public class TestComparator {
    public static void main(String[] args) {
        Integer[] arr = {2, 3, 44, 11, 344, 11};
        MyComparator cmp = new MyComparator();
        Arrays.sort(arr, cmp);//arr是数组,cmp是传入这个类
        System.out.println(Arrays.toString(arr));
    }
    //控制台打印结果:
    //[344, 44, 11, 11, 3, 2]
}


而在真正写代码的时候 我们一般 通过匿名内部类的方法 去写一个比较器比如下面

public class TestComparator {
    public static void main(String[] args) {
        Integer[] arr = {2,3,44,11,344,11};
        Arrays.sort(arr, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(Arrays.toString(arr));
    }
    //控制台打印结果:
    //[344, 44, 11, 11, 3, 2]
}


相关文章
|
小程序 Java API
认证服务:整合短信验证码
认证服务:整合短信验证码
|
10月前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器ECS架构区别及选择参考:X86计算、ARM计算等架构介绍
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别,本文主要简单介绍下这些架构各自的主要性能及适用场景,以便大家了解不同类型的架构有何不同,主要特点及适用场景有哪些。
1477 10
|
缓存 监控 网络协议
面对ARP攻击,怎么做好主机安全,受到ARP攻击有哪些解决方案
ARP攻击的具体原理主要是基于ARP(Address Resolution Protocol,地址解析协议)的漏洞进行欺骗和攻击。ARP协议是TCP/IP协议族中的一个重要协议,用于实现IP地址到MAC地址的映射。然而,由于ARP协议在设计时缺乏必要的安全验证机制,使得攻击者有机会进行欺骗和攻击。
|
人工智能 安全 Devops
让研发规范管得住,在流水线之上做研发流程
研发规范的目标,是为了解决或降低出现软件危机的风险。但传统流水线受限于工具的定位,无法解决研发规范的落地问题,需要在更高的层面来解决。阿里云云效团队经过内部启发后推出的新产品:云效应用交付平台 AppStack 给出了解决方案,快来使用体验吧!
79803 7
|
编解码 前端开发 UED
移动端适配:前端开发的必经之路
【2月更文挑战第1天】移动端适配:前端开发的必经之路
511 0
|
开发工具 计算机视觉 文字识别
接入阿里视觉智能平台免费体验—人脸人体识别ocr与二次元风格转化使用
接入阿里视觉智能平台免费体验—人脸人体识别ocr与二次元风格转化使用
21777 4
接入阿里视觉智能平台免费体验—人脸人体识别ocr与二次元风格转化使用
|
SQL 存储 关系型数据库
[译]Postgres15-新特性-利用pg_walinspect对WAL事件进行debug
[译]Postgres15-新特性-利用pg_walinspect对WAL事件进行debug
400 0
|
网络安全 Go Cloud Native
【小技巧】SSH连接服务器后如何默认执行多条命令?
大家平时有没有遇到自己连接云服务器,ssh 连接上去之后,发现自己的一些小工具用不了 例如go build无法使用 ,由于我们安装配置golang 环境的时候
346 0
【小技巧】SSH连接服务器后如何默认执行多条命令?
|
监控 网络协议 安全
2023年最新整理的中兴设备命令合集,网络工程师收藏!
2023年最新整理的中兴设备命令合集,网络工程师收藏!
1142 0
|
XML Dubbo 网络协议
【网络】一文带你了解什么是RPC
http接口是在接口不多、系统与系统交互较少的情况下,初期常使用的一种通信手段。优点就是简单、直接、开发方便。利用现成的http协议进行传输。
509 1
【网络】一文带你了解什么是RPC

热门文章

最新文章