Java Comparable及Comparator接口区别详解

2020-07-01 13:00 来源:易采站长站 作者:王冬梅 点击: 评论:

A-A+

原标题:Java Comparable及Comparator接口区别详解

在实际应用中,我们往往有需要比较两个自定义对象大小的地方。而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的。所以Java中要比较对象的大小或者要对对象的集合进行排序,需要通过比较这些对象的某些属性的大小来确定它们之间的大小关系。

一般,Java中通过接口实现两个对象的比较,比较常用就是Comparable接口和Comparator接口。首先类要实现接口,并且使用泛型规定要进行比较的对象所属的类,然后类实现了接口后,还需要实现接口定义的比较方法(compareTo方法或者compare方法),在这些方法中传入需要比较大小的另一个对象,通过选定的成员变量与之比较,如果大于则返回1,小于返回-1,相等返回0。

一般简单的回答可以这么说:

1)首先这两个接口一般都是用来实现集合内的排序,comparable还可以用于两个对象大小的比较。

2)Comparable接口在java.lang包下面。里面有一个compareTo(T)接口方法。当一个类需要比较的时候,需自行实现Comparable接口的CompareTo方法。当调用集合排序方法的时候,就会调用对象的compareTo()方法来实现对象的比较。

3)Comparator接口在java.util包下面。Comparator是一个比较器接口,一般单独定义一个比较器实现该接口中的比较方法compare();在集合sort方法中传入对应的比较器实现类。一般使用匿名内部类来实现比较器。

4)Comparator相对于Comparable来说更加的灵活,耦合度低。

首先呢,我们可以先了解一下List是如何排序的,我通过写一个例子来说明;

先写一个实体类;

public class User {
  private String name;
  private Integer age;
  public static void main(String[] args) {
    List<User> users=new ArrayList<>();
    users.add(new User("yao",19));
    users.add(new User("zhang",20));
    users.add(new User("li",17));
    users.add(new User("xu",15));
    users.add(new User("xupeng",15));
    users.sort(new UserComparator());
    System.out.println(users);
  }
  public User(){

  }
  public User(String name, Integer age) {
    this.name = name;
    this.age = age;
  }
  @Override
  public String toString() {
    return "User{" +
        "name='" + name + '\'' +
        ", age=" + age +
        '}';
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Integer getAge() {
    return age;
  }
  public void setAge(Integer age) {
    this.age = age;
  }
}

再写一个实现比较器接口的类方法;

/**
 * 实现比较器接口,并重写compare方法
 */
public class UserComparator implements Comparator<User> {
  @Override
  public int compare(User o1, User o2) {
    int age=o1.getAge()- o2.getAge();
    return age!=0?age:o1.getName().length()-o2.getName().length();
  }
}

【易采站长站编辑:秋军】