似懂非懂 Comparable和 Comparator

在java中提供了两种排序方式:Comparable和 Comparator,它们两个看起来非常的相似,在不是很了解的情况下不知道如何使用,什么情况下使用哪个进行排序,接下来就看下它们的一个区别和使用方式:

Comparable

首先看下 Comparable,Comparable 它可以看成是一个排序接口,一个类实现了该接口,就表示该类本身具有排序的功能,如果对该类的集合或者数组进行排序,则可以使用 Collections.sort() 和 Arrays.sort() 进行排序而不用再指定额外的比较器;

此外,实现了该接口的类,也可以作为 SortedMap 和 SortedSet 的 key 也不用再指定额外的比较器, 但是,如果需要把实现了该接口的类当作 SortedMap 的 Key 或者 放入到  SortedSet 中,需要保证 e1.compareTo(e2) == 0 和 e1.equals(e2) 相等,

但是有一点需要注意的是:因为 e.equal(null) 会返回false,所以,当我们需要比较的对象为 null 的时候,应该抛出一个 空指针异常。

接下来看下 Comparable 接口的方法,该接口下只有一个方法:

该接口返回一个 int 类型,有三种情况:

若 e1 > e2 则 e1.compateTo(e2) > 0,返回正数

若 e1 = e2 则 e1.compateTo(e2) = 0,返回0

若 e1 < e2 则 e1.compateTo(e2) < 0,返回负数

接下来看下如何使用:

首先定义一个类实现该接口,之后重写 compareTo() 方法,一般也需要重写 equal()  和 hashcode() 方法:

接下来就可以对 该类进行排序了:

首先创建该对象的一个集合:

之后,可以使用   Collections.sort() 和 Arrays.sort() 进行排序,而不用再指定额外的比较器了:

之后,还可以把这些对象放入到 SortedSet 中,就会自然对这些对象进行排序:

因为 Set 中没有重复元素,所有会过滤掉重复的元素。

在java的核心类库中,一些类已经实现该接口,所以可以直接对应它们进行排序,如 String , Integer 等:

Comparator

Comparator 可以把它看成是一个比较器接口,它是一个比较器,实现该接口的类本身没有比较的功能,只是用它去对其他的元素进行排序:

Comparator 接口有两个方法:

还有一些默认的方法,都是一些 java8 中的方法,

自定义一个比较器:

之后就可以使用该自定义的比较器对集合进行排序:

当然,也可以不用自定义一个比较器,直接使用匿名类即可,如下:

总结:

Comparable 它是一个排序接口,实现该接口的类本身具有排序的功能,可以直接使用 Collections.sort() 和 Arrays.sort() 进行排序而不用再指定额外的比较器;也可以直接放入到 SortedSet 和 SortedMap 中的保证其有序;

Comparator 它是一个比较器,实现该接口的类只能用其对其他对象进行排序;

Comparable 更多的像一个内部比较器,而 Comparator  更多的像一个外部比较器

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java中提供了两种对集合或数组中元素进行排序的方法,一种是实现Comparable接口,另一种是实现Compar...
    EakonZhao阅读 8,489评论 0 9
  • Java集合框架 Java平台提供了一个全新的集合框架。“集合框架”主要由一组用来操作对象的接口组成。不同接口描述...
    小石38阅读 371评论 0 0
  • 一 与母亲说 每年回老家,YY都会跟母亲唠嗑。 母亲说:几个兄弟姐妹中,平日里YY最辛苦,但赚的钱最多。 YY低着...
    简萧一阅读 379评论 0 0
  • 最近,时局不稳,高层似乎发生了什么事,不过,个人觉得确实有点过,造神运动确实让人目不暇接,一天到晚的学学学。但是,...
    福慧倍增阅读 105评论 0 0
  • 摘录自第四季《奇葩说》关于该不该把父母送到养老院?马微微的阐述 你们觉得什么样的人才会结婚生子,然...
    楼尚青阅读 242评论 0 0