Comparable和Comparator接口都是用来比较大小的,首先来看一下Comparable的定义:
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
- Comparable对实现他的每个类的对象进行整体排序。若一个类实现了comparable接口,实现Comparable接口的类的对象的List列表可以通过Collections.sort()进行排序。实现comparable必须修改自身的类。
- 如果一个类无法修改,例如String。String中已经实现了Comparable接口。这是对类无法修改就用到了Comparator这个接口。
- 为什么comparator继承的时候只实现了一个方法。
实际上,当一个类没有显示继承父类的时候,会有一个默认的父类。就是object。在object类中有一个equals的方法。所以不强制要求comparator实现equals方法,直接调用父类的即可。虽然你显示地实现了equals()方法更好。
Comparable 是排序接口;若一个类实现了 Comparable 接口,就意味着 “该类支持排序”。而 Comparator 是比较器;我们若需要控制某个类的次序,可以建立一个 “该类的比较器” 来进行排序。
- 前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于 “静态绑定”,而后者可以 “动态绑定”。
- 我们不难发现:Comparable 相当于 “内部比较器”,而 Comparator 相当于 “外部比较器”。
例子
package com.wyd.cn;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
public class collection_com {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> list = new LinkedList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();
String a;
int array[]= {1,7,2,3};
for(int i=0;i<array.length;i++)
{
list.add(new Integer(array[i]));
list2.add(new Integer(array[i]));
}
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o2-o1;
}
});
Collections.sort(list2);
for(int i=0;i<array.length;i++)
{
System.out.println(list.get(i));
System.out.println(list2.get(i));
}
}
}
class person implements Comparator<person>
{
@Override
public int compare(person o1, person o2) {
// TODO Auto-generated method stub
return 0;
}
}