Compareble和Comparator的比较

Comparable接口

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

/*

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

* @author Josh Bloch

* @see java.util.Comparator

* @since 1.2

*/

public interface Comparable<T> {

public int compareTo(T o);

}

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

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

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

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

样例

        
//String类实现了Comparabel接口
List<String> 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<String>, CharSequence {
    ......
}

Comparator接口

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

int compare(T o1, T o2);

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

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

public static <T> void sort(T[] a, Comparator<? super T> c) {

...

...

}

或者

public static <T> void sort(List<T> list, Comparator<? super T> c) {

list.sort(c);

}

总结

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

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

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

样例


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值