原文地址:http://leihuang.org/2014/11/16/Comparable-Vs-Comparator/

Comparable和Comparator都是用来实现集合中元素的比較、排序的,仅仅是Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以。如想实现排序,就须要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。

Comparator位于包java.util下,而Comparable位于包 java.lang下.

Comparable 是一个对象本身就已经支持自比較所须要实现的接口(如 String、Integer 自己就能够完毕比較大小操作,已经实现了Comparable接口)

自己定义的类要在增加list容器中后可以排序,可以实现Comparable接口,在用Collections类的sort方法排序时,假设不指定Comparator,那么就以自然顺序排序,如API所说:

Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface

这里的自然顺序就是实现Comparable接口设定的排序方式。

而 Comparator 是一个专用的比較器,当这个对象不支持自比較或者自比較函数不能满足你的要求时。你能够写一个比較器来完毕两个对象之间大小的比較。

能够说一个是自已完毕比較,一个是外部程序实现比較的区别而已。

用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。

Comparable interface

比如我们定义一个类Country,我们希望他的对象有大小关系,且根据countryId来排序的。所以我们让Country实现Comparable接口,使其具备大小关系的能力,代码例如以下:

class Country implements Comparable{
private int countryId ;
@Override
public int compareTo(Object o) {
Country country = (Country)o ;
return this.getCountryId()>country.getCountryId()?1:this.getCountryId()==
country.getCountryId()?0:-1 ;
}
}

此时Country就具备了比較的能力了,如同Integer,String类一样,此时Country对象的集合就能够通过Collections.sort(),或者Arrays.sort(),来进行排序了。

以下我们来看看Comparator使怎样实现的。

Comparator interface

就像我们之前说的一样,Comparator事实上就好像一个工具,它不是使得Country具有排序性。而是他不改变Country类本身,而是单独实现一个排序工具。来提供给Country用。以下我们就来实现这个排序工具类。

class Country{
private int id ;
public Country(int id){
this.id = id ;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
class CountryByIdComparator implements Comparator<Country>{
@Override
public int compare(Country o1, Country o2) {
return o1.getId()>o2.getId()?1:o1.getId()==o2.getId()?0:-1 ;
}
}

大家注意到没。单单看Country类。事实上并没有跟比較有不论什么关系,可是它却能通过实现Comparator借口的工具类ContryByIdComparator来实现自己主动排序。此时调用的Collections.sort()就须要两个參数了,一个是集合,一个是实现Comparator接口的工具类。

我们也能够利用匿名内部类来实现,而不须要单独定义ContryByIdComparator这样一个工具类,代码例如以下:

Collections.sort(cityList,new Comparator<City>(){
@Override
public int compare(City o1, City o2) {
return o1.getId()>o2.getId()?1:o1.getId()==o2.getId()?0:-1 ;
} }) ;

Comparator 是策略模式(strategy design pattern),就是不改变对象自身。而用一个策略对象(strategy object)来改变它的行为。

以下这张图就是它们两的差别:

Refference

  1. Comparable与Comparator的差别
  2. Difference between Comparator and Comparable in Java

2014-11-16 17:27:25

Brave,Happy,Thanksgiving !

Comparable和Comparator的差别的更多相关文章

  1. Java Comparable和Comparator

    Java中在进行数据排序时,Comparable和Comparator不可缺少会遇得到.普通的String.Integer等类型,已经实现了Comparable接口,而有些时候,我们须要对一些其它不存 ...

  2. Comparable与Comparator

    转载 Comparable与Comparator的区别 (转载) Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部 ...

  3. Java基础之Comparable与Comparator

    Java基础之Comparable与Comparator 一.前言: Java中实现对对象的排序一般情况下主要有以下两种实现方式(万物皆对象嘛): 对象所在的类实现Comparable 接口 定义比较 ...

  4. Java中Comparable与Comparator的区别

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

  5. 对象比较器:Comparable和Comparator

    在进行对象数组排序的过程中需要使用到比较器,比较器有两个:Comparable和Comparator ①.java.lang.Comparable:是在类定义是时候默认实现好的接口,里面提供有一个co ...

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

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

  7. Comparable和Comparator的区别

    Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较 ...

  8. Java中Comparable和Comparator区别小结

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

  9. Java 中 Comparable 和 Comparator 比较

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

随机推荐

  1. 消息中间件ActiveMQ及Spring整合JMS的介绍

    一 .消息中间件的基本介绍 1.1 消息中间件 1.1.1 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排 ...

  2. 利用 bat 批量处理命令实现手动控制mysql /Oracle 服务的开启和关闭

    利用 bat 批量处理命令实现手动控制mysql /Oracle 服务的开启和关闭 因为最近在学习数据库的知识,主要学习的是oracle 数据库,然而好巧啊,java也是在学习,我们老师现在要我们做一 ...

  3. 向TRichEdit插入图片的单元

    很简单, 就3个函数, 直接看代码吧 unit RichEditBmp; { 2005-03-04 LiChengbin Added: Insert bitmap or gif into RichEd ...

  4. c# asp.net 多数组索引的解决方法

    本人今天做了一个功能 需要在一个类里用多个数组, 数组需要索引器来调用  一个数组 我查了msdn 一个类里面只能有一个this 索引器 那这么多数组如何构造索引呢 我在坛子里找到了解决之道 view ...

  5. 新建Vue项目

    新建Vue项目 1.安装Vue命令行工具,webpack和git,使用淘宝镜像CNPM.参考http://www.imooc.com/video/12299 2.打开命令行,进入到要存放的目录,win ...

  6. gulp 打包合并

    1.安装node.js  下载地址: http://nodejs.cn/ 打开node.js 命令行,输入: node  -v ,有版本号,则正确安装. 2.安装淘宝镜像 :命令行输入 : npm i ...

  7. Python基础---python中的异常处理

    Python中的异常处理 一.什么是异常处理 python解释器检测到错误,触发异常(也允许程序员自己触发异常) 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关) ...

  8. OpenTSDB-Writing Data

    Writing Data You may want to jump right in and start throwing data into your TSD, but to really take ...

  9. Eclipse中代码整体左移,右移快捷键

    1.向右:将要移动的代码选中,然后按TAB键2.向左:将要移动的代码选中,然后按SHIFT+TAB键

  10. JAVA基础面试(五)

    41.a.hashCode() 有什么用?与 a.equals(b) 有什么关系?        hashCode() 方法对应对象整型的 hash 值.它常用于基于 hash 的集合类,如 Hash ...