1.接口Comparable<T> API

   参数类型:T ---可以与此对象进行比较的那些对象的类型

此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo()方法被称为它的自然比较方法

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器

Comparable也只有int compareTo(T object)一个方法。比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

 public class Person implements Comparable<Person>
 {
     String name;
     int age;
     public Person(String name, int age)
     {
         super();
         this.name = name;
         this.age = age;
     }
     public String getName()
     {
         return name;
     }
     public int getAge()
     {
         return age;
     }
     @Override
     public int compareTo(Person p)
     {
         return this.age-p.getAge();
     }
     public static void main(String[] args)
     {
         Person[] people=new Person[]{new Person("wangwu", 18),new Person("zhaoliu", 19)};
         System.out.println("排序前");
         for (Person person : people)
         {
             System.out.print(person.getName()+":"+person.getAge());
         }
         Arrays.sort(people);  33         System.out.println("\n排序后");
         for (Person person : people)
         {
             System.out.print(person.getName()+":"+person.getAge());
         }
     }
 }

2.接口 Comparator<T> API

强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sortArrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

(1)int compare(T o1, T o2)

比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。

    抛出异常:ClassCastException - 如果参数的类型不允许此 Comparator 对它们进行比较。

(2)boolean equals(Object obj)

指示某个其他对象是否“等于”此 Comparator。此方法必须遵守 Object.equals(Object) 的常规协定。此外,仅当 指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时,此方法才返回 true。因此,comp1.equals(comp2) 意味着对于每个对象引用 o1o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))

注意, 重写 Object.equals(Object) 方法总是 安全的。然而,在某些情况下,重写此方法可以允许程序确定两个不同的 Comparator 是否强行实施了相同的排序,从而提高性能。

若一个类要实现Comparator 接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。

 //定义一个比较器
 public class PersonCompartor implements Comparator<Person>
 {
     @Override
     public int compare(Person o1, Person o2)
     {
         return o1.getAge()-o2.getAge();
     }
 }

 public class Person
 {
     String name;
     int age;
     public Person(String name, int age)
     {
         super();
         this.name = name;
         this.age = age;
     }
     public String getName()
     {
         return name;
     }
     public int getAge()
     {
         return age;
     }
     public static void main(String[] args)
     {
         Person[] people=new Person[]{new Person("xujian", 20),new Person("xiewei", 10)};
         System.out.println("排序前");
         for (Person person : people)
         {
             System.out.print(person.getName()+":"+person.getAge());
         }            //创建比较器参数PersonCompartor
         Arrays.sort(people,new PersonCompartor());  38         System.out.println("\n排序后");
         for (Person person : people)
         {
             System.out.print(person.getName()+":"+person.getAge());
         }
     }
 }

3.Comparator与Comparable比较

(1)Comparable 接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序.

    Comparable是 定义在 Person类的内部称为“内部排序”,是一种简单的方式,需要修改源代码。

Arrays.sort(people);

(2)Comparator 是比较器,排序时,需要新建比较器对象,将比较器和对象一起传递过去就可以比大小,可称为“外部排序”。

Comparator 是定义在Person的外部的, 此时我们的Person类的结构不需要有任何变化。并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

Arrays.sort(people,new PersonCompartor());

相关链接

Java中Comparable和Comparator区别小结

java容器---Comparable & Comparator的更多相关文章

  1. Java提高十五:容器元素比较Comparable&Comparator深入分析

    我们经常用容器来存放元素,通常而言我们是不关系容器中的元素是否有序,但有些场景可能要求容器中的元素是有序的,这个时候用ArrayList  LinkedList  Hashtable HashMap ...

  2. Java之Comparable接口和Comparator接口

    Comparable & Comparator 都是用来实现集合中元素的比较.排序的: Comparable 是在集合内部定义的方法实现的排序: Comparator 是在集合外部实现的排序: ...

  3. 小白养成记——Java比较器Comparable和Comparator

    一.使用情景 1.  调用Arrays.sort()方法或Collections.sort()方法对自定义类的对象排序 以Arrays.sort()为例.假定有如下自定义的Person类 1 publ ...

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

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

  5. Java 中 Comparable 和 Comparator 比较

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

  6. 给jdk写注释系列之jdk1.6容器(9)-Strategy设计模式之Comparable&Comparator接口

    前面我们说TreeMap和TreeSet都是有顺序的集合,而顺序的维持是要靠一个比较器Comparator或者map的key实现Comparable接口.      既然说到排序,首先我们不用去关心什 ...

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

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

  8. Java学习笔记--集合元素的比较Comparable,Comparator

    原文见: http://www.cnblogs.com/sunflower627/p/3158042.html 1. Comparator 和 Comparable 相同的地方 他们都是java的一个 ...

  9. Java.lang.Comparable接口和Java.util.Comparator接口的区别

    Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 1.Com ...

随机推荐

  1. 解题:CF825E Minimal Labels

    题面 看起来似乎是个水水的拓扑排序+堆,然而并不对,因为BFS拓扑排序的话每次只会在“当前”的点中排出一个最小/大的字典序,而我们是要一个确定的点的字典序尽量小.正确的做法是反向建图,之后跑一个字典序 ...

  2. MySQL 第五篇:索引原理与慢查询优化

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  3. 音视频处理之FFmpeg+SDL视频播放器20180409

    一.FFmpeg视频解码器 1.视频解码知识 1).纯净的视频解码流程 压缩编码数据->像素数据. 例如解码H.264,就是“H.264码流->YUV”. 2).一般的视频解码流程 视频码 ...

  4. Java6的新特性

    原文出处:xixicat 序 本文梳理了下java6的新特性,相对于java5而言,java6的特性显得少些,分量也不那么重,相当于java5是windows xp,java6有点像vista. 特性 ...

  5. Hadoop生态圈-Hive快速入门篇之Hive环境搭建

    Hadoop生态圈-Hive快速入门篇之Hive环境搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据仓库(理论性知识大多摘自百度百科) 1>.什么是数据仓库 数据 ...

  6. 基于索引的MySQL优化

    今天查看MySQL慢查询日志,查看一个四表关联的SQL操作,耗时1006s.这次也是基于基于子查询的思路,对上表进行优化.使时间复杂度降到n^2级别.但优化之后时间反而是原来的三倍多. 原SQL语句: ...

  7. Showbo.js弹窗实现(jquery)

    一.搭建环境 下载showBo.js和showBo.css 下载链接:https://pan.baidu.com/s/1iUUlKXFNXCBEvBnds4ECIA  密码:its4 显示效果图: 二 ...

  8. 转:iOS7导航栏遮盖问题的解决

    在开发iOS7的界面的时候,有时候你会发现UIViewController里的subView有时会被导航栏遮盖,原因是iOS7鼓励全屏布局,UIViewController中的self.view的坐标 ...

  9. NOIP2011 提高组 Day2

    自测时间:2017.4.12 8:15——11:45 实际得分:100+0+0=100 期望得分:100+100+0=260 T2 符合要求的总价值*符合要求的总个数 写成:符合要求的总价值*区间总个 ...

  10. 2016/2/13 《计算机系统要素》(The Elements of Computing Systems)读书笔记(1)

    过年期间一直在啃一本书,学习计算机组成原理. 这是一本很棒的书,是一个基于项目的学习过程.可以让人理解的很深刻. coursera上有这本书前半部分的教程,是由书的作者团队们开的课,个人认为很棒,可惜 ...