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比较的更多相关文章

  1. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  2. Java 中 Comparable 和 Comparator 比较

    Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...

  3. Java 中 Comparable 和 Comparator 比较(转)

    转自http://www.cnblogs.com/skywang12345/p/3324788.html 本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示 ...

  4. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  5. Java中Comparable和Comparator区别小结

    一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...

  6. Java中Comparable和Comparator你知多少?

    前言: 我喜欢这种遨游在Java的世界里,精心研究学习新鲜事物的感觉,即便再小再细再微不足道的东西,也让我乐此不疲,同时我也更愿意将我所会的东西分享出来供大家学习以及方便自己日后回顾.好了,闲话不多说 ...

  7. java中Comparable和Comparator两种比较器的区别

    Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...

  8. 【转载】Java中Comparable和Comparator比较

    [本文转自]http://www.cnblogs.com/skywang12345/p/3324788.html Comparable 简介 Comparable 是排序接口. 若一个类实现了Comp ...

  9. 你能说说Java中Comparable和Comparator的区别吗

    之前面试中被问到这个问题,当时不屑(会)回答,下来特意查了查,整理如下. Java 中为我们提供了两种比较机制:Comparable 和 Comparator,二者都是用来实现对象的比较.排序. 下面 ...

  10. 夯实Java基础(十五)——Java中Comparable和Comparator

    1.前言 对于Java中的对象,我们只能使用基本运算符==.!=来判断一下地址是否相等,不能使用>.<来比较大小.但是在实际的开发中,我们需要对对象进行排序,也就是比较大小,那么应该如何实 ...

随机推荐

  1. Python实战之列表简单练习

    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__ ...

  2. Nunit测试工具使用实例

    前言: 本文主要是介绍了Nunit的基本使用,其中参详了很多已有的文章,由于最近要使用其进行测试,所以对网上的文章做了下整理,同时加入了一些自己的实践. NUnit的属性 TestFixture 它标 ...

  3. open() close()

    open() 方法可以查找一个已经存在或者新建的浏览器窗口. 语法: window.open([URL], [窗口名称], [参数字符串]) 每个参数必须用引号 参数说明: URL:可选参数,在窗口中 ...

  4. asp.net中利用Jquery+Ajax+Json实现无刷新分页(二)

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="PageTest.aspx.cs ...

  5. WPF DataGrid绑定一个组合列

    WPF DataGrid绑定一个组合列 前台: <Page.Resources>        <local:InfoConverter x:Key="converter& ...

  6. WPF DataGrid Custommization using Style and Template

    WPF DataGrid Custommization using Style and Template 代码下载:http://download.csdn.net/detail/wujicai/81 ...

  7. winPcap编程之获取适配器详细信息(三)

    显示适配器详细信息 先贴上代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #includ ...

  8. ReactiveCocoa_v2.5 源码解析之架构总览

    ReactiveCocoa 是一个 iOS 中的函数式响应式编程框架,它受 Functional Reactive Programming 的启发,是 Justin Spahr-Summers 和 J ...

  9. android 屏幕适配基础(1)

    1. 概念定义 寸/英寸:   1寸=3.333333厘米:1英寸=2.54厘米(屏幕尺寸以英寸为单位) 像素 :    像素是组成图象的最基本单元要素:点. 一个像素有多大呢?主要取决于显示器的分辨 ...

  10. iOS开发中使用文字图标iconfont

    在iOS的开发中,各种图标的使用是不可避免的,如果把全部图标做成图片放在项目中,那么随着项目的逐渐庞大起来,图片所占的地方就会越来越大,安装包也就随之变大了,如果图标需要根据不同的场景改变使用不同的颜 ...