Comparable和Comparator接口
目录
Comparable接口
Comparator接口(比较器)
Comparable接口和Comparator的比较
总结
Comparable接口
作用:实现对引用数据类型的比较和排序
使用:待比较类实现接口并且覆写接口中的compareTo方法
实例:
public class Person {private String name;//姓名private int age;//年龄public Person(String name,int age) {this.name = name;this.age = age;}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;}@Overridepublic String toString() {return "姓名:" + name + " 年龄:" + age; }
}
对于上述的Person类,现在有四个实例化对象,现在要对这四个实例化对象通过使用Comparable接口按照年龄或者其他属性进行排序,那么就需要Person类实现Comparable接口并且覆写compareTo方法:
public class Person implements Comparable<Person> {....@Overridepublic int compareTo(Person o) {//return o.age - this.age; //降序排列return this.age - o.age; //升序排列}
}
测试:
public class ComparableTestDrive {public static void main(String[] args) {Person[] person = new Person[4];person[0] = new Person("huahua",18);person[1] = new Person("niuniu",19);person[2] = new Person("manage",28);person[3] = new Person("shuaishuai",17);Arrays.sort(person);System.out.println(Arrays.toString(person));}
}
//输出:(年龄升序)
//[姓名:shuaishuai 年龄:17, 姓名:huahua 年龄:18, 姓名:niuniu 年龄:19, 姓名:manage 年龄:28]
Comparator接口(比较器)
Comparator也可用于引用数据类型的排序,相对于Comparable接口有自己独特的优势,Comparator和Compareable接口的比较写在第三部分。
对于上述的Person类,如果使用Comparator接口来实现按年龄或者其他属性来进行排序,可以不用再去操作Person类,而只需要在使用排序方法的时候使用匿名内部类实现其中的compare方法,会发现这种比较方法实现的排序不用再依赖于待比较的类型,实现了比较和对象类型的解离,这样即使再使用非自定义类时,也可以通过该接口实现期望的数据排序。
测试(不用操作Person类):
public class ComparableTestDrive {public static void main(String[] args) {Person[] person = new Person[4];person[0] = new Person("huahua",18);person[1] = new Person("niuniu",19);person[2] = new Person("manage",28);person[3] = new Person("shuaishuai",17);Arrays.sort(person, new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {//return o2.getAge() - o1.getAge();//降序排列return o1.getAge() - o2.getAge();//升序排列}});System.out.println(Arrays.toString(person));}
}
//输出(按年龄升序的结果):
//[姓名:shuaishuai 年龄:17, 姓名:huahua 年龄:18, 姓名:niuniu 年龄:19, 姓名:manage 年龄:28]
Comparable接口和Comparator的比较
字面含义的区别:
- Comparable以able结尾,更代表着一种功能,例如上述的Person类在实现Comparable接口后可以理解为Person类的对象之间具有了比较的功能
- Comparator意为比较器,更像一种用于比较的工具或者说是比较的参与者。
用法的区别:
- 使用Comparable接口来实现对象之间的比较或者排序,就必须在对象对应类中实现Comparable接口并且覆写compareTo方法
- 使用Comparator接口来实现对象的排序,可以使用匿名内部类在排序类的外部实现Conparator接口并且重写compare方法
应用场景区别:
- 使用Comparable接口实现排序,必须对排序类的内部进行操作
- 使用Comparator比较器接口可以实现比较对象和比较器的解离,在类的外部通过匿名内部类进行对象间的比较
总结
Comparable和Comparator接口都可以用于自定义对象之间的比较排序,不同的是,使用Comparable接口必须操作比较类,需要覆写compareTo方法,这样当使用第三方提供的类进行对象的排序时,就很难进行操作;而使用Comparator接口可以不用再操作比较类而通过匿名内部类覆写compare方法实现比较对象的排序。所以Comparable更像是“对内”进行排序的接口,而Compator比较器实现了与比较类d额解耦,在不修改比较类的同时实现排序,因此更像是“对外”提供排序的接口。
Comparable和Comparator接口相关推荐
- Java中Comparable和Comparator接口区别分析
本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comp ...
- java comparator相等_详解Java中Comparable和Comparator接口的区别
详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...
- java compareable接口_Java对象比较-Comparable和Comparator接口使用
最近在学习贪心算法和动态规划的过程中,里面有一段自然排序的操作,顺便简单了解一下Java中对象比较后排序要使用的两个接口:Comparable和Comparator.如果是数字,直接比较就行,但是如果 ...
- 使用Comparable、Comparator接口实现对对象数组、List集合自定义排序
1.实现对象数组排序 (1)方法一,需要排序的对象所属的类实现Comparable接口,复写 comparaTo方法 (2)方法二,需要排序的对象所属的类已经完成无法实现Comparable接口,这 ...
- Java中Comparable和Comparator接口的区别
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/u010859650/article/details/85009595 Comparable 简介 Comparable 是排序 ...
- Comparable和Comparator接口是干什么的?列出它们的区别。
ava提供了只包含一个compareTo()方法的Comparable接口.这个方法可以个给两个对象排序.具体来说,它返回负数,0,正数来表明已经存在的对象小于,等于,大于输入对象. Java提供了包 ...
- Comparable和Comparator接口时干什么的?列出它们的区别
一.对Comparable 的解释 Comparable是一个排序接口 此接口给实现类提供了一个排序的方法,此接口有且只有一个方法 public int compareTo(T o); compare ...
- 比较器(Comparable与Comparator接口)
有错之处,希望大家可以指出来,谢谢. 文章目录 概念 Comparable接口 Comparable接口实现注意:接口的实现位置要在类所在的位置,比如此类是Worker类那么Comparable接口要 ...
- 【Java】Comparable和Comparator接口
活动地址:CSDN21天学习挑战赛 ✨博客主页: XIN-XIANG荣 ✨系列专栏:[Java SE] ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录 一. Comparable接口 1. C ...
最新文章
- ISME:西农沈锡辉+韦革宏+王瑶揭示细菌铁获取和外膜囊泡招募新机制
- php mysql update 返回_php mysql_query增删改查(update delete insert)返回值类型
- 【数据库实验课堂】实验三:管理SQL Server表数据
- mysql ip比较大小_MySQL优化/面试,看这一篇就够了
- Python和它高大上的插件们
- facebook加密货币项目_Facebook数字货币:Libra的起源—加密货币(比特币)
- Sicily 1029. Rabbit 解题报告
- 我如何学习:不要停下学习的脚步
- Windows 无法访问\\196.168.206.xx,你的计算机配置似乎是正确的,但该设备无法访问的问题解决
- uva 1328(kmp)
- QT-程序依赖打包-windeployqt方式(简述版)
- usb声卡驱动_艾肯iCON ProDrive第三代USB声卡驱动全新发布!
- 基尔霍夫定律(Kirchhoff laws)
- 什么是搜索引擎?搜索引擎有哪些?
- 移动互联网创业:美国不代表全球
- 基于MATLAB的一维条码二维码识别
- Codeforces 300D Painting Square 题解
- 使用Blinker+ESP8266接入天猫精灵
- 可以用api控制的电源开关_一种穿戴式系统电源控制器设计与实现
- 念整数:你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si