Java中Comparable和Comparator比较
1、Comparable 介绍
Comparable 是一个排序接口,如果一个类实现了该接口,说明该类本身是可以进行排序的。注意,除了基本数据类型(八大基本数据类型) 的数组或是List,其余类型的对象,Collections.sort或Arrays.sort 是不支持直接进行排序的,因为对象本身是没有“顺序”的,除非你实现了Comparable 接口或是自定义了Comparable 对象,指定了排序规则,才可以进行排序。
Comparable 源码就一个方法,
public interface Comparable<T> {
public int compareTo(T o);
}
泛型T表示要进行比较的对象所属的类型,compareTo 比较对象之间的值的大小关系,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
定义一个对象:
public class Person implements Comparable<Person>{
public int age;
public Person(int age){
this.age = age;
}
public String toString() {
return "{" +
"age=" + age +
'}';
}
@Override
public int compareTo(Person o) {
//Person 对象之间根据名字排序
return this.age - o.age;
}
}
排序测试:
public static void main(String[] args) {
Person[] ps =new Person[]{new Person(1),new Person(4),
new Person(2),new Person(7),new Person(9),new Person(8),
new Person(3),new Person(0),new Person(1)};
System.out.println("排序前:"+Arrays.toString(ps));
//进行排序
Arrays.sort(ps);
System.out.println("排序后:"+Arrays.toString(ps));
}
排序前:[{age=1}, {age=4}, {age=2}, {age=7}, {age=9}, {age=8}, {age=3}, {age=0}, {age=1}]
排序后:[{age=0}, {age=1}, {age=1}, {age=2}, {age=3}, {age=4}, {age=7}, {age=8}, {age=9}]
2、Comparator 介绍
如果一个类本身并没有实现 Comparable 接口,我们想要对他进行排序,就要自定义 Comparator 比较器进行比较,在这个比较器里面自定义排序的依据。
Comparator 源码中主要的两个接口方法:
public interface Comparator<T>
{
int compare(T o1, T o2);
boolean equals(Object obj);
}
compare 是主要方法,必须要实现,equals 方法可以不实现。compare 中返回比较结果,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
定义一个用来排序类,该类并为实现 Comparable 接口:
private static class Man{
public int age;
public Man(int age){
this.age = age;
}
public String toString() {
return "{" +
"age=" + age +
'}';
}
}
进行排序:
@Test
public void test_1(){
Man[] ps =new Man[]{new Man(1),new Man(4),new Man(2),
new Man(7),new Man(9),new Man(8),new Man(3),new Man(0),new Man(1)};
//数组转List
ArrayList<Man> ap = new ArrayList<Man>(Arrays.asList(ps)); System.out.println("排序前:"+ap);
//自定义排序器
Collections.sort(ap,new Comparator<Man>() {
@Override
public int compare(Man o1, Man o2) {
//根据年龄进行排序
return o1.age - o2.age;
}
}); System.out.println("排序后:"+ ap);
}
排序前:[{age=1}, {age=4}, {age=2}, {age=7}, {age=9}, {age=8}, {age=3}, {age=0}, {age=1}]
排序后:[{age=0}, {age=1}, {age=1}, {age=2}, {age=3}, {age=4}, {age=7}, {age=8}, {age=9}]
3、总结比较
Comparable 在类的内部定义排序规则,Comparator 在外部定义排序规则,Comparable 相当于“内部排序器”,Comparator 相当于“外部排序器”,前者一次定义即可,后者可以在不修改源码的情况下进行排序,各有所长。
Java中Comparable和Comparator比较的更多相关文章
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Java 中 Comparable 和 Comparator 比较
Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...
- Java 中 Comparable 和 Comparator 比较(转)
转自http://www.cnblogs.com/skywang12345/p/3324788.html 本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示 ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- Java中Comparable和Comparator区别小结
一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...
- Java中Comparable和Comparator你知多少?
前言: 我喜欢这种遨游在Java的世界里,精心研究学习新鲜事物的感觉,即便再小再细再微不足道的东西,也让我乐此不疲,同时我也更愿意将我所会的东西分享出来供大家学习以及方便自己日后回顾.好了,闲话不多说 ...
- java中Comparable和Comparator两种比较器的区别
Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...
- 【转载】Java中Comparable和Comparator比较
[本文转自]http://www.cnblogs.com/skywang12345/p/3324788.html Comparable 简介 Comparable 是排序接口. 若一个类实现了Comp ...
- 你能说说Java中Comparable和Comparator的区别吗
之前面试中被问到这个问题,当时不屑(会)回答,下来特意查了查,整理如下. Java 中为我们提供了两种比较机制:Comparable 和 Comparator,二者都是用来实现对象的比较.排序. 下面 ...
- 夯实Java基础(十五)——Java中Comparable和Comparator
1.前言 对于Java中的对象,我们只能使用基本运算符==.!=来判断一下地址是否相等,不能使用>.<来比较大小.但是在实际的开发中,我们需要对对象进行排序,也就是比较大小,那么应该如何实 ...
随机推荐
- Sublime Text保存文件时自动去掉行末空格
修改一个Sublime Text的用户配置,其中这个配置就是"保存文件时自动去掉每行结束后多余的空格",具体操作如下: 在Sublime Text菜单栏中找到preferences ...
- 我从.net转别的语言的遭遇,现在貌似又要回头(一)
从2016年开始,作为公司最后的一个.net部门,被迫转向了php. php里面装得一手什么逼呢? 首先,你要来几本入门的书,linux,mysql,php基础语法,nginx或apache.哥那时候 ...
- Jquery qTip2实现多种提示效果,支持ajax,以及多种样式
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- redis性能调优笔记(can not get Resource from jedis pool和jedis connect time out)
对这段时间redis性能调优做一个记录. 1.单进程单线程 redis是单进程单线程实现的,如果你没有特殊的配置,redis内部默认是FIFO排队,即你对redis的访问都是要在redis进行排队,先 ...
- 使用beanstalkd实现定制化持续集成过程中pipeline
持续集成是一种项目管理和流程模型,依赖于团队中各个角色的配合.各个角色的意识和配合不是一朝一夕能练就的,我们的工作只是提供一种方案和能力,这就是持续集成能力的服务化.而在做持续集成能力服务化的过程中, ...
- 深刻理解反射(Reflection)
最近公司在搞自动化测试,由于版权问题,无法用 '录制脚本' 进行,也就没法用 VS 自带的 UITest 框架(蛋疼), 所以只能开源的 FlaUI 框架来搞了.其中不可避免的涉及到反射的应用,但自己 ...
- 即时通信系统Openfire分析之六:路由表 RoutingTable
还是从会话管理说起 上一章,Session经过预创建.认证之后,才正常可用.认证时,最重要的操作,就是将Session加入到路由表,使之拥用了通信功能. 添加到至路由表的操作,是在SessionMan ...
- riot.js教程【一】简介
Riotjs简介 Riotjs是一款简单的.优雅的.组件化UI前端开发框架: 他支持自定义标签(custom tags),拥有令人愉悦的语法,优雅的API和非常小的体积: 为什么需要一个新的界面库 前 ...
- winPcap编程之不用回调方法捕获数据包(五 转)
这一次要分析的实例程序跟上一讲非常类似(“打开适配器并捕获数据包”),略微不同的一点是本次将pcap_loop()函数替换成了pcap_next_ex()函数.本节的重点也就是说一下这两个函数之间的差 ...
- sys.argv向脚本中传递参数
可以向脚本中传递无限多个参数,其值是一个列表,默认sys.argv[0]内容是脚本文件路径加文件名 test.py文件中的内容如下: #! /usr/bin/python3import sys pri ...