首页 > 其他 > 详细

Comparable 和 Comparator的区别

时间:2019-07-29 15:22:37      阅读:80      评论:0      收藏:0      [点我收藏+]

Comparable

Comparable 是排序接口。

  • 若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
  • “实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。

Comparable接口中定义了一个方法:

public interface Comparable<T> {
    public int compareTo(T o);
}

假设我们通过 x.compareTo(y) 来“比较x和y的大小”。

  • 若返回“负数”,意味着“x比y小”;
  • 返回“零”,意味着“x等于y”;
  • 返回“正数”,意味着“x大于y”。

举例:

public class Girl implements Comparable<Object> {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Girl(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Girl [name=" + name + ", age=" + age + "]";
    }

    @Override
    public int compareTo(Object o) {
        Girl g = (Girl)o;
        return this.age - g.getAge();
    }

}

public static void main(String[] args) {
        
    List<Girl> list = new ArrayList<>(100);
    Girl girl;
    for (int i=0; i<75; i++) {
        girl = new Girl("girl " + i, i);
        list.add(girl);
    }
    Collections.shuffle(list);
    Collections.sort(list);
    list.stream().forEach(System.out::println);
    
}

Comparator

Comparator 是比较器接口。

  • 我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
  • 一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式。同时使用时,Comparator的优先级高于Comparable。

Comparator接口中定义了两个方法:

public interface Comparator<T> {

    int compare(T o1, T o2);
    
    boolean equals(Object obj);
    
}

compare返回值:

  • 若返回“负数”,意味着“o1比o2小”;
  • 返回“零”,意味着“o1等于o2”;
  • 返回“正数”,意味着“o1大于o2”。

举例:

public class GirlComparator implements Comparator<Girl> {

    @Override
    public int compare(Girl g1, Girl g2) {
        return g1.getAge() - g2.getAge();
    }
    
}

public static void main(String[] args) {

    List<Girl> list = new ArrayList<>(100);
    Girl girl;
    for (int i = 0; i< 75; i++) {
        girl = new Girl("girl "+i, i);
        list.add(girl);
    }
    Collections.sort(list,new GirlComparator());
    list.stream().forEach(System.out::println);
}

总结

  1. java中8大基本类型都实现了Comparable接口,如果没有实现Comparable接口的类想排序或者已实现Comparable接口的类想修改排序,可以使用Comparator接口,Comparator相当于是对Comparable的一种扩展和补充。
  2. Comparator是对排序的解耦,它可以灵活的修改排序规则,而不用修改待排序的类。

Comparable 和 Comparator的区别

原文:https://www.cnblogs.com/fantasyfc/p/11264003.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!