Java 之 Comparable vs Comparator

简介: Comparable和Compator都是用于给集合排序的接口,但是他们之间的区别是什么呢。Comparable: 这个接口只有一个方法compareTo。

Comparable和Compator都是用于给集合排序的接口,但是他们之间的区别是什么呢。

  • Comparable: 这个接口只有一个方法compareTo。比如我们想通过年龄给用户排序,那么我们的用户要实现Comparable接口的方法,假如一旦要通过用户的评分进行排序,我们就必须要修改compareTo方法。
// o 是要比较的对象
// 返回负数,小于要比较的对象
// 返回 0 ,等于要比较的对象
// 返回正数,大于要比较的对象
public interface Comparable<T> {
    public int compareTo(T o);
}    
  • Comparator: 这个接口有两个方法,equals和compare. 要进行比较的类不一定非要实现Comparator接口,由第三方的类实现这个接口来进行排序。 这样的话,排序的种类就可以有很多种,并且像对用户进行排序,我们可以通过年龄,姓名,评分等进行排序也不用修改用户类。我们要做的应该就是写 AgeComparator,NameComparator,RankComparator.
public interface Comparator<T> {
// 返回负数,第一个小于第二个的对象,o1 < o2
// 返回 0 ,对象相等  o1 = o2
// 返回正数,第一个大于第二个对象 o1 > o2
    int compare(T o1, T o2);

  
    // 判断Compator之间是不是相同的
    boolean equals(Object obj);
}

案例

通过Comaparable排序
  1. 如果是通过评分(rank)进行排序,User类写法如下
public class User implements Comparable<User>{
    private Integer id;
    private Integer rank;
    private Integer age;
    private String name;

    //getter and setter
    
    public User(Integer rank, Integer age, String name) {
        this.rank = rank;
        this.age = age;
        this.name = name;
    }
    
    // 通过rank进行排序
    @Override
    public int compareTo(User o) {
        return this.getRank() - o.getRank();
    }
    
     @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", rank=" + rank +
                ", age=" + age +
                '}';
    }
}

  1. 如果想要通过年龄进行排序,那么就要修改User对象。
public class User implements Comparable<User>{
    private Integer id;
    private Integer rank;
    private Integer age;
    private String name;

    //getter and setter
    
    public User(Integer rank, Integer age, String name) {
        this.rank = rank;
        this.age = age;
        this.name = name;
    }
    
    // 通过rank进行排序
    @Override
    public int compareTo(User o) {
        return this.getAge() - o.getAge();
    }
    
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", rank=" + rank +
                ", age=" + age +
                '}';
    }
}
  1. 写测试类。
public class App {
    public static void main(String[] args) {
        List<User> list = new ArrayList<User>();
        list.add(new User("aihe",100,23));
        list.add(new User("weidong",80,25));
        list.add(new User("zhangbo",85,28));
        list.add(new User("leizhen",90,29));
        Collections.sort(list);
        System.out.println(list);
    }
}
通过Comparator进行排序
  1. 如果是通过Rank进行排序,创建RankComparator类。
public class RankComparator implements Comparator<User> {
    // 通过rank进行排序
    public int compare(User o1, User o2) {
        return o1.getRank() - o2.getRank();
    }
}
  1. 如果是通过年龄进行排序,创建AgeComparator类。
public class AgeComparator implements Comparator<User> {
    // 通过age进行排序
    public int compare(User o1, User o2) {
        return o1.getAge() - o2.getAge();
    }
}
  1. 测试类。
public class App {
    public static void main(String[] args) {
        List<User> list = new ArrayList<User>();
        list.add(new User("aihe",100,23));
        list.add(new User("weidong",80,25));
        list.add(new User("zhangbo",85,28));
        list.add(new User("leizhen",90,29));
        Collections.sort(list,new RankComparator());
        //Collections.sort(list,new AgeComparator());
        System.out.println(list);
    }
}

小结

如果我们的排序方式一般不会变化,我们知道要排序什么字段,在创建对象的时候可以直接实现Comparable接口。

如果我们还不清楚要比较什么字段,那么可以等到后续确定的时候实现Comparator接口,Comparator接口是从外部进行排序,不会对对象产生影响。

参考

目录
相关文章
|
1月前
|
存储 安全 Java
ArrayList vs. LinkedList: Java集合框架的比较与应用
ArrayList vs. LinkedList: Java集合框架的比较与应用
|
4月前
|
Java C++ 网络架构
【Java】@ApiOperation vs @ApiResponse in Swagger
【Java】@ApiOperation vs @ApiResponse in Swagger
40 0
|
3月前
|
Java
彻底搞懂Java中的Comparable和Comparator
彻底搞懂Java中的Comparable和Comparator
55 0
|
6天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。
|
29天前
|
Java
【Java】通过Comparator比较器的方式给对象数组排序
【Java】通过Comparator比较器的方式给对象数组排序
9 0
|
1月前
|
算法 搜索推荐 Java
数据结构与算法(Java篇)笔记--Comparable接口
数据结构与算法(Java篇)笔记--Comparable接口
|
2月前
|
Java
java 实现Comparable接口排序,升序、降序、倒叙
java 实现Comparable接口排序,升序、降序、倒叙
20 0
|
3月前
|
Java
Java如何给数组排序Comparable方式
Java如何给数组排序Comparable方式
10 0
|
3月前
|
Java
Java如何给数组排序Comparator方式
Java如何给数组排序Comparator方式
27 0
|
3月前
|
Java
Java中的比较器Comparable与Comparator
Java中的比较器Comparable与Comparator