Java笔记-Comparable 和 Comparator比较

发布时间:2019-11-21 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java笔记-Comparable 和 Comparator比较脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

虽是读书笔记,但是如转载请注明出处http://segmentfault.com/blog/bigdatafinding/
..拒绝伸手复制党


本文参考以下链接总结:
http://bluelzx.iteye.com/blog/200987
http://www.cnblogs.com/skywang12345/p/3324788.html


有两种方式可以进行集合排序 :

  1. 集合中对象的所属类实现了 java.lang.COMparable 接口
  2. 为集合指定比较器 java.lang.Comparator 的实现类

1. java.lang.Comparable

public interface Comparable 接口强行对实现它的每个类的对象进行整体排序。 -- 自然排序。类的compareTo称为自然比较方法。

这个接口的作用?
若一个类实现了Comparable 接口,实现 Comparable 接口的类的对象的 List 列表 ( 或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
此外,实现 Comparable 接口的类的对象 可以用作 “有序映射 ( 如 TreeMap)” 中的键或 “有序集合 (TreeSet)” 中的元素,而不需要指定比较器。

如何实现?
利用Comparable接口创建自己的类的排序顺序,只是实现comparaTo方法的问题。
通常就是依赖几个数据成员的自然排序。同时类也应该覆盖equals()和hashCode() 以确保两个相等的对象返回同一个哈希码。

Comparable接口只有一个方法,compareTo(Object obj),定义如下:

public interface Comparable<T> {     public int compareTo(T o); } 

通常需要覆写 compareTo 方法实现排序规则的应用 : int compareTo(Object o): 比较当前实例对象与对象 o ,如果位于对象 o 之前,返回负值,如果两个对象在排序中位置相同,则返回 0 ,如果位于对象 o 后面,则返回正值。

在 Java 2 SDK 版本 1.4 中有24个类实现 Comparable 接口。下表展示了 8 种基本类型的自然排序。虽然一些类共享同一种自然排序,但只有相互可比的类才能排序。

排序
BigDecimal,BigInteger,Byte,Double, Float,Integer,Long,Short
按数字大小排序
Character
按 Unicode 值的数字大小排序
String
按字符串中字符 Unicode 值排序

举个例子:
覆写compareTo : 设计一个有序Person类,实现了Comparable接口, 以年龄为第一关键字,姓名为第二关键字升序排序

 public int compareTo(Person person) {        int cop = age - person.getAge();        if (cop != 0)            return cop;        else            return name .compareTo(person. name );     } 

再举个例子,设计有序Person类,以id为关键字:
//实现Comparable接口的抽象方法,定义排序规则

public int compareTo(Object o){   Person per = (Person)o;   return this.id - per.id; } 

2. Comparator 比较器接口(策略设计模式)

我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么可以建立一个该类的比较器来排序,这个比较器只需要实现Comparator接口即可。
namely, 通过实现Comparator类来新建一个比较器,然后通过该比较器来对类进行排序。Comparator 接口其实就是一种策略模式的实践

接口作用?
1.如果一个类已经开放完成,但是在此类建立的初期并没有实现 Comparable 接口,此时肯定是无法进行对象排序操作的,所以为了解决这一的问题,java 又定义了另一个比较器的操作接口 Comparator 此接口定义在 java.util 包中
2. 为了使用不同的排序标准做准备,比如升序,降序或者其他什么序列

如何定义?
接口仅仅包括两个函数

package java.util;  public interface Comparator<T> {     int compare(T o1, T o2);     boolean equals(Object obj);  } 
  1. 若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2)函数,但是可以不实现equals函数。
    为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了 equals(Object obj) 的。 Java 中的一切类都是继承于 java.lang.Object,在 Object.java 中实现了 equals(Object obj) 函数;所以,其它所有的类也相当于都实现了该函数。

  2. int compare(T o1, T o2) 是 “比较 o1 和 o2 的大小”。返回 “负数”,意味着 “o1 比 o2 小”;返回 “零”,意味着 “o1 等于 o2”;返回 “正数”,意味着 “o1 大于 o2”。

举个例子,Student例子已经写完,但是想根据age进行排序

Student stu[] = {                   new Student("张三" ,23),                   new Student("李四" ,26)                   , new Student("王五" ,22)};  Arrays. sort(stu,new MyComparator());     List<Student> list = new ArrayList<Student>();  list.add( new Student("zhangsan" ,31));  list.add( new Student("lisi" ,30));  list.add( new Student("wangwu" ,35));  Collections. sort(list,new MyComparator()); 

3.Comparable 和 Comparator比较

Comparable 是排序接口;若一个类实现了 Comparable 接口,就意味着 “该类支持排序”。
而 Comparator 是比较器;我们若需要控制某个类的次序,可以建立一个 “该类的比较器” 来进行排序。

前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于 “静态绑定”,而后者可以 “动态绑定”。

我们不难发现:Comparable 相当于 “内部比较器”,而 Comparator 相当于 “外部比较器”。

脚本宝典总结

以上是脚本宝典为你收集整理的Java笔记-Comparable 和 Comparator比较全部内容,希望文章能够帮你解决Java笔记-Comparable 和 Comparator比较所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。