简介
Comparable和Comparator都是接口,一般都用于比较。但是Comparable只有一个compareTo方法。Comparator里面有很多方法,但是都有默认方法(java8接口可以实现默认方法),主要实现compare接口。
应用
Comparable
Comparable主要用于同对象之间的比较,因为它的compareTo接口只有一个对象。看下实际的例子。
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class TestComparable implements Comparable<TestComparable> {
private String name;
public TestComparable(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "TestComparable{" +
"name='" + name + '\'' +
'}';
}
@Override
public int compareTo(TestComparable o) {
return this.getName().compareTo(o.getName());
}
public static void main(String[] args) {
TestComparable testComparable1 = new TestComparable("对象C");
TestComparable testComparable2 = new TestComparable("对象B");
List<TestComparable> comparables = Arrays.asList(testComparable1, testComparable2);
Collections.sort(comparables);
System.out.println(comparables);
}
}
但是如果想要不同对象类型比较怎么办呢,比如A对象和B对象之间比较,这又办呢,这样就可以使用Comparator接口了。
Comparator
直接看例子吧
先定义一个接口
public interface IOrder {
int getOrder();
}
再有两个实现类
public class OrderA implements IOrder {
@Override
public int getOrder() {
return 3;
}
}
public class OrderB implements IOrder {
@Override
public int getOrder() {
return 2;
}
}
最后再定义一个比较器
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class OrderSort implements Comparator<IOrder> {
@Override
public int compare(IOrder o1, IOrder o2) {
if (o1.getOrder() > o2.getOrder()) {
return 1;
} else if (o1.getOrder() < o2.getOrder()) {
return -1;
}
return 0;
}
public static void main(String[] args) {
List<IOrder> orders = Arrays.asList(new OrderA(), new OrderB());
orders.sort(new OrderSort());
System.out.println(orders);
}
}
这样就可以实现不同类型对象的排序的。
其实在spring源码中排序基本都是这样的方式,bean实现order接口或者注解,再定义一个外部比较器拿到order值进行排序。
总结
Comparable和Comparator都可以用于比较,只不过Comparable一般是定义在要比较对象内部,同种对象比较。而Comparator是一般定义在外部,可以不同对象之间比较。