java中Comparable和Comparator的区别

博客介绍了Comparable和Comparator实现自定义排序的方式。Comparable需让要比较的类实现该接口;Comparator则不修改类源码,新建类实现接口。还指出两者区别,Comparable是内部比较器,实现简单但需改源码;Comparator是外部比较器,无需改源码且可实现复杂通用逻辑。

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

Comparable实现自定义排序的方式:使要比较的类实现这个接口即可

@Data
@ToString
public class Student implements  Comparable<Student>{
	private String name;
	private int age;
    private Date birth;

    public Student(){

	}

	public Student(String name, int age, Date birth) {
    	super();
		this.name = name;
		this.age = age;
		this.birth = birth;
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;
		Student student = (Student) o;
		return age == student.age &&
			Objects.equals(name, student.name);
	}

	@Override
	public int hashCode() {

		return Objects.hash(name, age);
	}
	/**
	比较规则:先比较出生日期,按升序排列,再比较年级,
	按升序排列,最后比较名字,按降序排列
	**/
	@Override
	public int compareTo(Student o) {
    	int result = 0;
    	result = this.birth.compareTo(o.birth);
    	if(0==result){
    		result = this.age-o.age;
    		if(result==0){
    			result = -this.name.compareTo(o.name);
			}
		}
		return result;
	}

}

外部调用排序:

Collections.sort(list);

Comparator的实现方式:不修改类的源码,新建一个类实现Comparator接口

@Data
@ToString
public class Goods {
	private String goodsName;
	private int price;
	private int count;

	public Goods() {
	}

	public Goods(String goodsName, int price, int count) {
		super();
		this.goodsName = goodsName;
		this.price = price;
		this.count = count;
	}


实现比较器

public final class GoodsComp implements Comparator<Goods> {
	private boolean query;

	public GoodsComp(boolean query){
		this.query = query;
	}
	@Override
	public int compare(Goods o1, Goods o2) {
         if(query){
         	return o1.getPrice()-o2.getPrice();
		 }else{
         	return o1.getCount()-o2.getCount();		 }

	}
}

这里加了一个boolean属性,用于指定排序规则是按price还是count属性进行,提高了可扩展性
外部调用比较器:假设按照price排序

Collections.sort(list,new GoodsComp (true));

两者的区别

  • Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

  • Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

  • 两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值