comparable和comparator的区别

本文详细解析了Java中comparable与comparator的区别,通过具体代码示例,阐述了两者在对象比较中的应用方式及场景。comparable适用于对象自身比较,而comparator作为外部比较器,提供更灵活的比较方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍

​ comparable与comparator都是java.util 下提供的比较器接口,用于两个对象之间的比较关系,其主要区别在与:

comparable:实现comparable接口在于实现接口的类型,某一个对象本身与相同类型的其他对象做比较;

comparator:comparator则是作为一个比较器的存在,不用需要比较的类类实现此接口而起其他类来实现此接口,从而起到一个比较器的作用对某一种类型的数据用于作比较;

​ 简单来说,comparable是本身与相同类型的其他对象做比较,comparator是两个相同类型的数据在某一处做比较。

二、代码

​ 一个用于比较的类、一个测试类,一个比较器类

package com.se.comp;
//用于比较的数据类型,同时使用Comparable 比较
public class Student implements Comparable<Student>{

    private int id;
    private String name;    
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Student(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + "]";
    }

    @Override
    public int compareTo(Student o) {
        if(this.id > o.getId())
            return 1;
        else if(this.id==o.getId())
            return 0;
            else
        return -1;
    }
}

//测试类,同时充当比较器的存在
package com.se.comp;
import java.util.Comparator;
public class MianTest<E> {


    public static void main(String[] args) {
        Student s1 = new Student(1,"张珊");
        Student s2 = new Student(2,"张珊");
        Student s3 = new Student(1,"张珊");
        System.out.println(s1.compareTo(s2));
        System.out.println(s2.compareTo(s1));
        System.out.println(s1.compareTo(s3));
        System.out.println((6-1>>>1)+"=============");
        StudentComp comp = new StudentComp();
        new MianTest<Student>(s1,s2,comp);
        MianTest<Student> cp = new MianTest<Student>(comp);

        System.out.println(cp.compara(s1, s2));
        System.out.println(cp.compara(s2, s1));
        System.out.println(cp.compara(s2, s2));
    }

    public MianTest() {
        super();
    }
    public MianTest(E e1, E e2, Comparator<E> ct) {
        super();
        this.e1 = e1;
        this.e2 = e2;
        this.ct = ct;
    }
    //传入一个比较器
    public MianTest(Comparator<E> ct) {
        super();
        this.ct = ct;
    }
    private E e1;
    private E e2;
    private Comparator<E> ct;
    public int compara(){
        return ct.compare(e1, e2);
    }
    //比较两个数据
    public int compara(E e1,E e2){
        return ct.compare(e1, e2);
    }
}

//比较器
package com.se.comp;
import java.util.Comparator;
public class StudentComp implements Comparator<Student>{

    @Override
    public int compare(Student s1, Student s2) {
        if(s1.getId()>s2.getId())
            return 1;
        else if(s1.getId()==s2.getId())
            return 0;
        else
            return -1;
    }
}

说个比较形象的说法:

​ 举个两人比较身高的例子,A和B两人需要比较身高,comparable是A与B背对背站在一起比较直接可以看出结果,可以把A或B看做比较对象(就是调用comparaTo方法的对象);comparator则是A与B分别在测量身高仪器上进行测量,然后比较两人的测量数据;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值