Java中的Comparable和Comparator

226 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

Comparable是什么

简介:实现该接口的类可以进行自比较

自比较:自己对象本身和参数进行比较

一个接口,实现了这个接口的类对象可以根据接口的方法compareTo进行比较来获取比较结果。同时这些对象可以被增加到Collaction集合中,使用Collections.sort(xxx)进行排序

/**
 * 实现一个业务逻辑
 * 多张优惠券。
 * 1,金额大的在前面
 * 2,金额相同时,距离有效期最近的在前面
 * 3,前两个结果相同时,id小的在前面
 */
public class ComparableDemo {
    public static void main(String[] args) {
        List<Coupon> coupons = new ArrayList<>();
        //添加了一堆coupon。然后调用下面方法就可以对coupon进行排序。这个方法参数必须是实现了Comparable接口并按照业务实现了compareTo方法
        Collections.sort(coupons);
    }
}
​
@Data
class Coupon implements Comparable<Coupon> {
    private String id;
    private Date endTime;
    private int price;
​
    @Override
    public int compareTo(Coupon o) {
        if (o.getPrice() > this.price) {
            return 1;
        } else if (o.getPrice() == this.price) {
            if (this.endTime.compareTo(o.getEndTime()) == 0) {
                return id.compareTo(o.getId());
            } else {
                return this.endTime.compareTo(o.getEndTime());
            }
        } else {
            return -1;
        }
    }
}

Comparator是什么

简介:可以辅助比较没有实现/想重写对方实现方法Comparable接口的对象进行比较

作用场景一般是

  • 预比较的对象没有实现Comparable接口或者实现的compareTo逻辑不是自己想要的,而且无法使用继承来实现(final)

比如我觉得String的自比较方式我不喜欢,那么就可以

class Express implements Comparator<String> {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        //表示不使用String自带的compareTo方法而是使用Express对象中的比较方法
        Collections.sort(strings, new Express());
    }
    @Override
    public int compare(String o1, String o2) {
        //xxxx各种逻辑实现
        return 0;
    }
}

两者的区别

Comparable侧重于自比较。也就是对象本身和一个对象的比较。compareTo方法参数是一个对象。

业务场景:将优惠券排序。

Comparator侧重于外比较,就像是帮助别人进行比较一样

业务场景:对名称排序(有时候想按照首字母的拼音排序,有时候想按首字母的笔画排序。)这个时候就可以创建多个类实现Comparator接口。

共同点:都可以使用Collections.sort()方法来对集合对象进行排序。以及好用的特点。

扩展TreeMap

相较于HashMap,TreeMap的主要特点在于可以比较元素的大小。在进行put的时候进行排序。其原理就是在创建Map的时候传入了一个比较器。在put方法的时候会调用这个比较器进行比较

Map<String, String> map2 = new TreeMap<String, String>(
                new Comparator<String>() {
                    public int compare(String obj1, String obj2) {
                        //升序排序(反过来就是降序排序)
                        return obj1.compareTo(obj2);
                    }
                });

其中实现的逻辑可以用来进行比较;下面进行put的时候就会自动按照比较结果进行排序。

真不错呀,每天一个小妙招