Compareble和Comparator的比较

Comparable接口

Comparable是java.lang包下的一个接口,源码如下:只有一个方法compareTo,Comparable

/*

* @param  the type of objects that this object may be compared to

* @author Josh Bloch

* @see java.util.Comparator

* @since 1.2

*/

public interface Comparable {

public int compareTo(T o);

}

根据源码上的说明:有以下要求

1)将其对象与指定的对象进行比较,返回一个负整数、零、正整数根据对象小于,等于或者大于指定的对象

2)具有对称性、传递性、自反性等

3) 强烈推荐但是不严格要求(x.cpmpareTo(y)==0)==(x.equals(y))

样例

        
//String类实现了Comparabel接口
List strs = new ArrayList<>();
strs.add("123");
strs.add("234");
strs.add(0, "abc");
Collections.sort(strs);
System.out.println(strs);


//String类的定义如下:Comparable为泛型接口,继承时最好也指定其泛型类型
public final class String implements Serializable, Comparable, CharSequence {
    ......
}

 

Comparator接口

在java.util包下,主要方法是

int compare(T o1, T o2);

Comparator可以认为是一个外比较器,两个比较对象只是是两个相同类型的对象。

比如我们在使用Collections.sort()或者Arrays.sort()方法时需要指定比较方法时可以通过如下面所示的方法进行设计 --重写compare方法

public static  void sort(T[] a, Comparator c) {

...

...

}

或者

public static  void sort(List list, Comparator c) {

list.sort(c);

}

总结

总结一下,两种比较器Comparable和Comparator,后者相比前者有如下优点:

1、如果实现类没有实现Comparable接口,又想对两个类进行比较(或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意),那么可以实现Comparator接口,自定义一个比较器,写比较算法

2、实现Comparable接口的方式比实现Comparator接口的耦合性 要强一些,如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类是在外部进行比较的,不需要对实现类有任何修改。从这个角度说,其实有些不太好,尤其在我们将实现类的.class文件打成一个.jar文件提供给开发者使用的时候。实际上实现Comparator 接口的方式后就是一种典型的策略模式。

 

样例


        List strs=new ArrayList<>();
        strs.add("123");
        strs.add("234");
        strs.add(0,"abc");
        Collections.sort(strs, new Comparator() {//匿名内部类
                    @Override
                    public int compare(String str1, String str2) {
                        return str1.length()-str2.length();//指定比较长度
                    }
                }
        );
        System.out.println(strs);

 

 

你可能感兴趣的:(Java)