Java服务_比较器Comparable和Comparator区别

Java服务_比较器Comparable和Comparator区别

Comparable:

1
2
3
4
5
6
package java.lang;
import java.util.*;

public interface Comparable<T> {
public int compareTo(T o);
}
  • Comparable是一个排序接口,如果一个类实现了该接口,就意味着该类支持排序,该类的实例化对象具有可比较性。
  • 在类中重写compareTo方法,定义该类的实例化对象的大小比较准则。
  • 实现该接口时泛型T写成实现它的类。

Comparator:

1
2
3
4
5
6
package java.util;

public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
  • Comparator是比较器接口,当我们要控制某个类的实例化对象的次序,使其具有可比较性,但是该类本身没有实现Comparable接口时,我们可以新建一个Comparator接口的实现类,用于比较该类实例化对象的大小。
  • 在该比较器实现类中重写compare方法,定义需要比较大小的实例化对象的比较准则。
  • 编写实现类时泛型T写成需要比较大小的类,且这种比较器实现类最常用的情况就是匿名类,如下代码:
1
2
3
4
5
6
7
8
9
10
Collections.sort(list2,new Comparator<Person2>(){

@Override
public int compare(Person2 o1, Person2 o2)
{
if(o1 == null || o2 == null) return 0;
return o1.getAge()-o2.getAge();
}

});
  • Comparator接口中的equals方法并不一定要实现,因为Java中的Object类已经实现类一种equals方法,如果想要不同的方法内容才需要重写。

排序规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Comparator
public int compare(Object obj1, Object obj2) {

//相当于从小到大排序,大的返回正值,往后放
return obj1.value() - obj2.value();

//相当于从大到小排序,大值返回负值,往前放
return - (obj1.value() - obj2.value());
}

//Comparable
public int compareTo(Object obj) {

//相当于从小到大排序,大的返回正值,往后放
return this.value() - obj.value();

//相当于从大到小排序,大值返回负值,往前放
return - (this.value() - obj.value());
}

也就是说,对于Comparator的compare()方法,当返回值为负值时,排序时会把第二个参数obj2放在第一个参数obj1后面;当返回值为正数时,会把第二个参数obj2放在第一个参数obj1前面。

Comparable与Comparator的区别

  • 想要一个类的实例化对象具有可比较性时,使该类实现Comparable接口就必须改变类自身,即在自身类中实现接口中相应的方法;而使用Comparator接口则是另外创建一个类使其实现该类的可比较性。
  • 像String这种JDK中已经定义死的类,我们可以运用Comparator重写String大小比较方法;或者一些无法继承其他类或者接口的类的可比较性也只能由Comparator来实现。
  • Comparable相当于和一个具体类绑定;Comparator比较灵活,可以被用于各个需要比较功能的类使用。
  • Comparable相当于一个内部比较器,而Comparator相当于一个外部比较器。