Java Comparable Comparator 接口的使用感悟

来源:互联网 发布:.shop域名上线时间 编辑:程序博客网 时间:2024/05/16 11:44

Java 中有两个比较接口分别是 Comparable 和 Comparator

现在本人分享下自己的体会,
实现了Comparable接口的Java类可以说自己类本身就能够支持比较排序功能。
可以作为Collections.sort() 或者是Arrays.sort()方法的输入。因为集合中的该类本身就可以被排序。
所以可以理解为’内部的排序’。
而Comparator接口则是相当于一个外部的排序。集合或数组里的元素可以本身不支持排序。只需要外部传入一个实现了Comparator接口的对象即可实现排序。
可以说,Comparator接口的排序方式更加的灵活可定制化。
我们可以来看一个例子 一个User对象根据字符串的长度被排序。

package org.huluo.java;public class User implements Comparable<User> {    public String string;    @Override    public int compareTo(User o) {        if (string.length() > o.string.length()) {            return -1;        }else {            return 1;        }    }    @Override    public String toString() {        return this.string;    }}

我们可以看到,User对象采用了Comparable的接口的排序的方式来实现排序。以后Collections.sort()方法对User的集合或者说是数组进行排序的时候就无需再自己传入排序的规则。因为User类本身就支持排序。
但是说我们可以看出来Comparable接口的实现耦合在了User这个实体类中。这是不好的一方面。如果哪一天业务需求要根据string的长度反着来,或者进行其他的规则来排序。那么如果使用了Comparable的接口的方式就要不停的进行改动代码。
所以,此时将排序的逻辑抽象出来使用Comparator的接口的实现类来进行传入。即可将实体对象和排序比较的逻辑合理的分离开。并且有利于多种的排序规则的有效管理。此时使用Comparator接口来实现排序。

读者们再想想。我们传入不同的Comparator接口的实现类进行不同的排序规则。
这其实是个典型的策略模式。

0 0
原创粉丝点击