浅析Comparable和Comparator

比如 int ,double 等基本类型数据,Java 可以对他们直接进行比较排序,但是在 Java 中经常会涉及到对 对象数组 的排序问题,那么就涉及到对象之间的比较问题 ,这时应该怎么办?

对象之间的排序要用到比较器

Java 实现对象排序的方式有两种:
自然排序: java.lang.Comparable
定制排序: java.util.Comparator

一.概述

Java 中的排序是由 Comparable 和 Comparator 这两个接口来实现的。
Comparable表示可被排序的,实现该接口的类的对象自动拥有排序功能。
Comparator则表示一个比较器,一般情况, 这个比较器将作为一个参数进行传递。

二.Comparable(自然排序)

Comparable 接口强行对实现它的每个类的对象进行整体排序

 public interface Comparable<T> {
    public int compareTo(T o);
 }
  • Comparable 的中文意思就是可被排序的,代表本身支持排序功能。只要我们的类实现了这个接口,那么这个类的对象就会自动拥有了可被排序的能力。而且这个排序被称为类的自然顺序。
  • 这个类的对象的列表可以被Collections.sort()和Arrays.sort()来执行排序。
  • 从源码中可以看到,该接口只有一个抽象方法compareTo() 这个方法主要就是为了定义我们的类所要排序的方式。compareTo()方法用于比较当前元素 a与指定元素 b的大小,结果为int值,如果a >b,int值>0; 如果a=b, int值=0;如果a<b, int值<0。

三.Comparator(定制排序)

在实际开发中,遇到当元素的类型实现了 Comparable 接口,但是它的排序方式不适合当前的操作;或者根本没有实现 Comparable接口,而又不方便修改代码。那么可以考虑使用定制一个 Comparator 的对象进行排序。

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

Comparator 中文译为比较器,它可以作为一个参数传递到Collections. sort()和Arrays.sort()方法,来指定某个类的对象的列表的排序方式。

四.二者比较

  • Comparable 可以看做是内部比较器,Comparator 可以看做是外部比较器
  • 一个类, 可以通过实现 Comparable 接口来自带有序性,也可以通过额外指定 Comparator 来附加有序性。二者的作用其实是一致的, 所以不要混用。

五.总结

  • Comparable为可排序的,实现该接口的类的对象自动拥有可排序功能。
  • Comparator为比较器,实现该接口可以定义一个针对某个类的排序方式。
  • Comparator与Comparable同时存在的情况下,前者优先级高。
  • Comparable和Comparator接口是用来对自定义的类class进行大小比较的。
  • Comparator和 Comparable的区别:Comparator定义在类的外部,而Comparable定义在类的内部。

六.具体实现

1.Comparable 定义在类的内部

例如:

public class Person implements Comparable<Person> {
	String name;
	int age;

	public  int compareTo(Person o) {
		return this.age-o.age;
	}
}

因为 Person 类已经实现了 Comparable 接口,那么 Person 类现在是一个可以比较大小的对象了,它的比较功能和 String 完全一样,可以随时随地的拿来比较大小,因为 Person 对象现在自身就是有大小之分的。

如果:

List < Person> list=new ArrayList()<>;
Collections.sort(list);              //可以得到正确的结果

2.Comparator 定义在类的外部

此时Person类的结构不需要有任何变化,

public class Person {
	String name;
	int age;
}

然后另外定义一个比较器:

public PersonComparator implements Comparator<Person> {
	int compare(o1,o2){
		return o1.name.compareTo(o2.name);
	}
}

使用:

List<Person> list=new ArrayList<>();
Collections.sort(list,new PersonComparator());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值