浅谈Comparable和Comparator

浅谈Comparable和Comparator

Comparable和Comparator是Java对集合对象、数组对象的排序的两种方式

Comparable

位于java.lang包下;是一个排序接口,自然排序,实现该接口的类,自动拥有排序的功能;该类的对象可以使用Collections.sort()和Arrays.sort()进行排序;

SortedMap 的key默认使用compareTo方法来进行键排序,SortedSet 默认使用compareTo方法进行元素的比较,也就说实现该接口的类对象,可以作为SortedMap的key和作为SortedSet的元素。

源码解析

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

a.compareTo(b):返回正数,说明a比b大

a.compareTo(b):返回负数,说明a比b小

a.compareTo(b):返回0,说明a和b相等

Comparator

位于java.util包下;是一个外部比较器接口,自定义排序,该类的对象可以作为Collections.sort()和Arrays.sort()方法的参数进行自定义排序。

对于SortedMap和SortedSet来说,一般要保证compare方法和equals方法的结果保持一致。

对于序列化数据结构的TreeMap和TreeSet来说,实现该接口的类也要实现Serializable接口保证序列化的能力。

源码解析

public interface Comparator {
    int compare(T o1, T o2);
    boolean equals(Object obj);
    // ...
}

compare(a, b):返回正数,说明a比b大

compare(a, b):返回负数,说明a比b小

compare(a, b):返回0,说明a和b相等

代码

Comparable

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student implements Serializable, Comparable {
    private String name;
    private Integer age;

    @Override
    public int compareTo(Student s) {

        if (age > s.getAge()) {
            return 1;
        } else if (age < s.getAge()) {
            return -1;
        } else {
            return 0;
        }
    }
}
@Test
public void test01() {

    List students = Arrays.asList(
            new Student("zhangsan", 15),
            new Student("lisis", 92),
            new Student("wangwu ", 19),
            new Student("zhaoliu", 18)
    );

    Collections.sort(students);

    students.stream().forEach(System.out::println);

}

输出:

Student(name=zhangsan, age=15)
Student(name=lisis, age=18)
Student(name=wangwu , age=19)
Student(name=zhaoliu, age=92)

Comparator

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Teacher implements Serializable {

    private String name;
    private Integer age;

}
@Test
public void test02() {
    List teachers = Arrays.asList(
            new Teacher("zhangsan", 15),
            new Teacher("lisis", 92),
            new Teacher("wangwu ", 19),
            new Teacher("zhaoliu", 18)
    );

    Collections.sort(teachers, (a, b) -> {
        if (a.getAge() > b.getAge()) {
            return 1;
        } else if (a.getAge() < b.getAge()) {
            return -1;
        } else {
            return 0;
        }
    });

    teachers.stream().forEach(System.out::println);
  
}

输出:

Teacher(name=zhangsan, age=15)
Teacher(name=lisis, age=18)
Teacher(name=wangwu , age=19)
Teacher(name=zhaoliu, age=92)

你可能感兴趣的:(浅谈Comparable和Comparator)