原文地址: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. HTML学习笔记 css定位浮动及瀑布流案例 第十三节 (原创) 参考使用表

    #fd { width: 100px; height: 150px; background-color: forestgreen; float: left; } #sd { width: 150px; ...

  2. iOS字符串修改及运用

    //创建字符串 直接赋值 NSString *lytTest = @"A common string"; 1.获取字符串的长度 NSLog(@"%d",lytT ...

  3. Python中time和datetime模块的简单用法

    python中与时间相关的一个模块是time模块,datetime模块可以看为是time模块的高级封装. time模块中经常用到的有一下几个方法: time()用来获取时间戳,表示的结果为从1970年 ...

  4. EasyUI扩展验证

    1.首先在jquery.easyui.min.js下最后插入下面代码 $.extend($.fn.validatebox.defaults.rules, { idcard : {// 验证身份证 va ...

  5. C# 控件的缩写

    1 btn Button 2 chk CheckBox 3 ckl CheckedListBox 4 cmb ComboBox 5 dtp DateTimePicker 6 lbl Label 7 l ...

  6. c++ const全局对象是如何处理的

    我主要是记录一个发现,目前我不能解释,先作个记录. const 只是一个 语义约束,由编译器强制实施的.使被约束的对象不能被直接访问修改. 我用 『直接』这词,因为在代码段中 ,用一个const 指针 ...

  7. Linux系列教程(二十二)——Linux的bash变量

    上篇博客我们介绍了bash的一些基本功能,这是我们平时操作最频繁的.本篇博客我们介绍bash的变量,为后面编写shell脚本做铺垫. 1.什么是变量 变量是计算机内存的单元,其中存放的值可以改变. 当 ...

  8. WinForm 窗体之间相互嵌套

    public FrmScan() { InitializeComponent(); Form1 frm = new Form1(); frm.Dock = DockStyle.Fill; frm.Fo ...

  9. 基于vue,打印机打印暂且处理

    基于vue单页面应用.暂且没找到合适的方案,什么vue-print  .jquery.print.js.jqprint.js..canvas生成图片啊 大多不能保证页面样式保持原样. 所以,选择了最土 ...

  10. 拼写纠错的利器,BK树算法

    BK树或者称为Burkhard-Keller树,是一种基于树的数据结构,被设计于快速查找近似字符串匹配,比方说拼写纠错,或模糊查找,当搜索”aeek”时能返回”seek”和”peek”. 本文首先剖析 ...