java中Comparable<T>与Comparator<T>的使用与区别

1.comparable的使用

comparable(内部比较器,比较属性,静态绑定)是一个排序接口,当某个类实现该接口后,该类就具备了排序的能力,前提是该类的属性具备排序的条件。实现comparable接口,Override接口的方法compareTo。一般来说,如果创建一个类,该类具有排序的属性,最好是实现该接口。
comparable接口的源码
在这里插入图片描述
现在我们就用一些具体的例子来说明comparable的使用。

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

/**
 * @author
 * @PackageName:PACKAGE_NAME
 * @ClassName:Student
 * @Description:
 * @date 2021-8-9 15:26
 */
public class Student implements Comparable<Student>{
    private Integer age;
    private String name;

    public Student(Integer age, String name) {
        this.age = age;
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        return this.age - o.age;//升序排序
    }


    public static void main(String[] args) {
        System.out.println("================使用Arrays.sort=============");
        Student[] students = new Student[3];
        students[0] = new Student(18, "xiaoxian");
        students[1] = new Student(23, "huajuan");
        students[2] = new Student(3, "xiaobaby");
        Arrays.sort(students);
        System.out.println(Arrays.toString(students));

        System.out.println("================使用Collections.sort=============");
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student(18, "xiaoxian"));
        list.add(new Student(23, "huajuan"));
        list.add(new Student(3, "xiaobaby"));
        Collections.sort(list);
        System.out.println(list);
    }
}

2.comparator的使用

comparator(外部比较器,比较器,动态绑定)是一个比较器。如果一个已经定义好了,不能修改时,但又想进行比较时,就可以使用该比较器进行排序。
comparator接口的源码
在这里插入图片描述
同样的我们用一些具体的例子来说明comparator的使用。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

/**
 * @author
 * @PackageName:PACKAGE_NAME
 * @ClassName:Student2
 * @Description:
 * @date 2021-8-9 15:59
 */
public class Student2 {
    private Integer age;
    private String name;

    public Student2(Integer age, String name) {
        this.age = age;
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Student2{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }


    public static void main(String[] args) {
        System.out.println("================使用Arrays.sort=============");
        Student2[] students = new Student2[3];
        students[0] = new Student2(18, "xiaoxian");
        students[1] = new Student2(23, "huajuan");
        students[2] = new Student2(3, "xiaobaby");
        Arrays.sort(students, new Comparator<Student2>() {
            @Override
            public int compare(Student2 o1, Student2 o2) {
                if (o1 == null || o2 == null) {
                    return 0;
                }
                return o1.getAge() - o2.getAge();
            }
        });
        System.out.println(Arrays.toString(students));


        System.out.println("================使用Collections.sort=============");
        ArrayList<Student2> list = new ArrayList<>();
        list.add(new Student2(18, "xiaoxian"));
        list.add(new Student2(23, "huajuan"));
        list.add(new Student2(3, "xiaobaby"));
        Collections.sort(list, new Comparator<Student2>() {
            @Override
            public int compare(Student2 o1, Student2 o2) {
                if (o1 == null || o2 == null) {
                    return 0;
                }
                return o1.getAge() - o2.getAge();
            }
        });
        System.out.println(list);
    }
}

3.两者的区别

通过对两者的使用说明,相信聪明的你能够看出两者的区别了,在这里我再稍稍总结一下。
(1)Comparable<T>是内部比较器,比较属性,静态绑定;而Comparator<T>是外部比较器,比较器,动态绑定
(2)如果一个类具有可比较的属性的话,并且想对该类的对象进行排序,最好是实现Comparable<T>接口。如果某个类已经定义好了,不想再修改,并且又想自定义规则对该类的对象进行排序,可以创建一个比较器进行排序。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值