所谓的比较器指的就是进行大小关系的确定判断。Java里面为了统一比较规则的定义,所以提供有比较器的接口:Comparable接口。
Comparable比较器
如果要实现对象的比较肯定需要有比较气来指定比较的规则,而比较的规则就通过Comparable来实现。
【范例】实现自定义对象数组排序操作
package demo;
import java.util.Arrays;
public class JavaDemoComparable {
public static void main(String[] args) {
Person data[] = new Person[] {
new Person("Cherry-A",18),
new Person("Cherry-B",30),
new Person("Cherry-C",25)
};
Arrays.sort(data);
System.out.println(Arrays.toString(data));
}
}
class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Person per) {
return this.age - per.age;
}
}
#[Person [name=Cherry-A, age=18], Person [name=Cherry-C, age=25], Person [name=Cherry-B, age=30]]
排序里面只需要又要给compareTo()
方法进行排序规则的定义,而后整个Java系统里面就可以为其实现排序处理了。
Comparator 比较器
Comparateor属于一种挽救的比较器支持,其主要目的是解决一些没有使用Comparable排序的类的对象数组排序。
【范例】:现在程序项目开发完成了,并且由于先期的设计并没有去考虑到所谓的比较器功能。
class Person {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
后来经过了若干版本的迭代更新之后发现需要对Person
类进行排序处理,但是又不能够去修改Person类。所以这时候就需要采用一种挽救的形式来实现比较再Arrays类里面排序又另外一种实现:
- 基于
Comparator
的排序处理:public static<T> void sort(T[] a, Comparator<? super T> c);
在java.util.Comparator里面最初只定义有一个排序的compare()方法(public int compare(T o1, T o2)
),后来持续发展出现了很多static方法。
【范例】定义排序规则类
class PersonCompatator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
}
在测试类进行排序处理的时候就可以进行排序。
package demo;
import java.util.Arrays;
import java.util.Comparator;
public class JavaDemoComparable {
public static void main(String[] args) {
Person data[] = new Person[] { new Person("Cherry-A", 18), new Person("Cherry-B", 30),
new Person("Cherry-C", 25) };
Arrays.sort(data, new PersonCompatator());
System.out.println(Arrays.toString(data));
}
}
class PersonCompatator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
面试题:请解释Comparable与Comparator的区别?
java.lang.Comparable
是在类定义的时候实现的父接口,主要用于定义排序规则,里面只有compateTo()方法。java.util.Comparator
是挽救的比较器操作,需要设置单独的比较器规则类实现排序,里面有compare方法。
参考资料:
https://edu.aliyun.com/roadmap/java?spm=5176.265303.1378567.1.6aa22072N1Mui4