Java中Comparable接口与Comparator接口的区别

一、

Java的命名规则讲究“见名知意”,compare(比较、对比)这个词我们非常熟悉,那么也基本知道Comparable接口与Comparator接口是干嘛的啦,其作用就是比较,这样可以方便对数组、集合类进行排序。因为可以直接调用Arrays.sort(数组)方法或Collections.sort(集合类)方法,而且通过翻看源码,我们发现这两个方法的底层实现确实是基于Comparable接口与Comparator接口的。

不同点:
1.接口中规定的方法不同
Comparable接口中是:public int compareTo(T o);
Comparator接口中是:int compare(T o1,T o2);

2.作用不同
Comparable接口:使你设计的类具有“天生”的比较能力,只要你实现了这个接口,并覆写了唯一的compareTo()方法。

Comparator接口:一个类一旦实现了Comparable接口,并覆写了compare()方法,那么它的实现方式就固定下来了,如果你不喜欢,还想有其他不同的排序方式,可以创建一个实现了此接口的单独的类。


二、Comparable接口

1.非常值得一提的是八大基本类型对应的包装类和字符串类都实现了此接口并覆写了compareTo()方法,所以调用Arrays.sort(数组)方法后可以得知排序后的数组,如下图所示。
在这里插入图片描述


2.如果自定义一个类,并没有实现Comparable接口,直接调用Arrays.sort(数组)方法,会抛出类型转化异常java.lang.ClassCastException,如下图所示。
在这里插入图片描述


3.Stu类实现Comparable接口,并覆写compareTo()方法

class Stu implements Comparable<Stu> {
	int id;
	String name;
	int age;

	public Stu(int id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}

	@Override
	public int compareTo(Stu stu) {
		return this.id - stu.id;
	}
}

public class Test {
	public static void main(String[] args) {
		Stu[] arr = { new Stu(143, "三儿",20), 
		new Stu(140, "四儿", 30), new Stu(141, "五儿", 19) };
		Arrays.sort(arr);
		for (Stu stu : arr) {
			System.out.println(stu.id + " " + stu.name + " " + stu.age);
		}
	}
}

可以得到按学号排序的输出。
在这里插入图片描述

三、Comparator接口

也正因为Stu类实现Comparable接口,并覆写compare()方法,所以以后只要一调用Arrays.sort(数组)方法,只能得到按学号排序的输出。但现在我想得到按年龄大小排序的输出怎么办?????那我们可以借用Comparator接口重新定义一个排序规则。

class Stu implements Comparable<Stu>{
	int id;
	String name;
	int age;

	public Stu(int id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}
	@Override
	public int compareTo(Stu stu) {
		return this.id - stu.id;
	}
}
//不想使用Stu天生的排序方法,自定义一个排序规则
class MyComparator implements Comparator<Stu> {
	@Override
	public int compare(Stu s1, Stu s2) {
		//按年龄大小排序
		return s1.age - s2.age;
	}
}

public class Test {
	public static void main(String[] args) {
		Stu[] arr = { new Stu(143, "三儿", 17), 
		new Stu(140, "四儿", 20), new Stu(141, "五儿", 19) };
		//按照自定义的排序规则排序
		Arrays.sort(arr, new MyComparator());
		for (Stu stu : arr) {
			System.out.println(stu.id + " " + stu.name + " " + stu.age);
		}
	}
}

可以得到按年龄从小到大排序输出。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值