comparable和Comparator的区别

Comparable & Comparator 都是用来实现集合中的排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。

具体请看 <Thinking  in  java>

Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作)

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

可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。

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

比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。

java 代码:

// AbsComparator.java
import  java.util.*;
public  class  AbsComparator  implements  Comparator  {
  public  int  compare(Object  o1,  Object  o2)  {
   int  v1  =  Math.abs(((Integer)o1).intValue());
   int  v2  =  Math.abs(((Integer)o2).intValue());
   return  v1  >  v2  ?  1  :  (v1  ==  v2  ?  0  :  -1);
  }
}

可以用下面这个类测试 AbsComparator:

// Test.java
import  java.util.*;
  public  class  Test  {
  public  static  void  main(String[]  args)  {
  //产生一个20个随机整数的数组(有正有负)
   Random  rnd  =  new  Random();
   Integer[]  integers  =  new  Integer[20];
   for(int  i  =  0;  i  <  integers.length;  i++)
   integers[i]  =  new  Integer(rnd.nextInt(100)  *  (rnd.nextBoolean()  ?  1  :  -1));
  system.out.println("用Integer内置方法排序:");
   Arrays.sort(integers);
   system.out.println(Arrays.asList(integers));
  system.out.println("用AbsComparator排序:");
   Arrays.sort(integers,  new  AbsComparator());
   system.out.println(Arrays.asList(integers));
  }
}

时间: 2024-11-04 23:59:55

comparable和Comparator的区别的相关文章

Java中Comparable与Comparator的区别

一.概述 Comparable和Comparator都是用来实现集合中元素的比较.排序的. Comparable是在集合内部定义的方法实现的排序,位于java.util下. Comparator是在集合外部实现的排序,位于java.lang下. Comparable是一个对象本身就已经支持自比较所需要实现的接口,如String.Integer自己就实现了Comparable接口,可完成比较大小操作.自定义类要在加入list容器中后能够排序,也可以实现Comparable接口,在用Collecti

Comparable与Comparator的区别

    前几天在项目中遇到了一个将复杂对象进行排序的问题:计算BingMap地图上距离当前位置5KM内发生事故(TrafficIncident)的点到当前位置的距离,并按距离升序排序.距离都算出来了,但这些TrafficIncident对象的排序却难到了我.经同事提醒,Comparable或Comparator是一个不错的选择.于是在网上搜索了一些资料,总结下来. 方式一: 实现Comparable接口     Comparable是java.lang包下的一个接口,该接口里只有一个compar

Java Comparable 和 Comparator 的详解及区别_java

Java Comparable 和 Comparator 的详解及区别 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下. Comparable 自然排序 Comparable 在 java.lang 包下,是一个接口,内部只有一个方法 compareTo(): public interface Comparable<T> { public int compareTo(T o); } Comparable 可以让实现它的

Java 中Comparable和Comparator区别比较_java

Comparable 简介Comparable 是排序接口.若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(或数组)",则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序.此外,"实现Comparable接口的类的对象"可以用作"有序映射(如Tre

java集合中Comparable和Comparator辨析

一.Comparable和Comparator简介 在对集合元素进行比较时一般使用TreeSet.对于简单的数据类型,TreeSet可以直接进行比较.但是对于复杂的数据类型,比如自己定义的数据类型或者类,就需要自己设置比较方法与比较规则了,这时就需要使用Comparable和Comparator. Comparable和Comparator都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现排序,而Comparator是在集合外部实现的排序.所以如果想对结合排序,需要在

Java 中Comparable 和 Comparator的比较

本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示例,对它们的使用方法进行说明. Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(或数组)",则该List列表(或数组)可以通过 Collections.sort(或 Array

Comparable与Comparator浅析

  今天博主在翻阅TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Comparator接口分别进行处理.那么疑问就来了,Comparable和Comparator接口的区别是什么,Java中为什么会存在两个类似的接口?   Comparable和Comparator接口都是用来比较大小的,首先来看一下Comparable的定义: package java.lang; impo

Comparable Comparator具体区别

问题描述 Comparable Comparator在对对象排序上具体是什么区别???不要说什么俩个接口里的方法不一样什么我是问具体排序上俩个有区别么???还有个问题:JavaEye怎么拿分???新注册的就这么几分问俩次问题就光了新手又不会帮人家解决问题哪里弄分??? 解决方案 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序.一.Comparator强行对某个对象collection进行整体排序的比较函数,可

Java语言入门教程(十七):Comparable与Comparator接口

在实际开发中,我们常常需要对某些数据进行排序,这些数据往往使用数组 或者集合保存.对于数组中的数据排序,API中提供了一个数组的工具类, java.util.Arrays,类中重载了大量的sort方法,可以对各种类型的数组进行排 序.如对于Object类型数组排序有如下方法: public static void sort(Object[] a) 假设有类Course,如下: package com.csst.relation; public class Course { private Str