疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java Comparable和Comparator区别比较


 

 
Comparable 是排序接口:
 
若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。例如TreeSet set = new TreeSet (new Compara());其中Compara是实现Comparable接口的类。
 
此接口强行对实现它的每个类的对象进行整体排序。此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 。实现此接口的对象列表(和数组)可以通过 Collections.sort (和 Arrays.sort )进行自动排序。实现此接口的对象可以用作有序映射表中的键或有序集合中的元素,无需指定比较器。 强烈推荐(虽然不是必需的)使自然排序与 equals 一致。所谓与equals一致是指对于类 C 的每一个 e1 和 e2 来说,当且仅当 (e1.compareTo((Object)e2) == 0) 与e1.equals((Object)e2) 具有相同的布尔值时,类 C 的自然排序才叫做与 equals 一致 。
 
强烈推荐 (x.compareTo(y)==0) == (x.equals(y)) 这种做法,但不是 严格要求这样做。一般来说,任何实现 Comparable 接口和违背此条件的类都应该清楚地指出这一事实。注释应当加上:“注意:此类具有与 equals 不一致的自然排序。
Comparator 是比较器接口:
 
我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。
 
说明:
(1) 若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以,其它所有的类也相当于都实现了该函数。
(2) int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
Comparator 和 Comparable 比较
 
1. Comparable是排序接口:若一个类实现了Comparable接口,就意味着“该类支持排序”。
2. Comparator是比较器:我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
3. Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
例子: comparator
public class Person {
 
    int id;
 
    String name;
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
}
 
public class SortComparator {
 
    class PersonCompara implements Comparator {
 
        @Override
        public int compare(Person o1, Person o2) {
            if (o1.getId() == o2.getId()) {
                return 0;
            } else if (o1.getId() > o2.getId()) {
                return 1;
            } else {
                return -1;
            }
        }
    }
 
    public static void main(String[] args) {
        List personList = new ArrayList ();
        Person person1 = new Person();
        person1.setId(1);
        person1.setName("name1");
        personList.add(person1);
        Person person2 = new Person();
        person2.setId(2);
        person2.setName("name2");
        personList.add(person2);
        Person person3 = new Person();
        person3.setId(3);
        person3.setName("name3");
        personList.add(person3);
        Collections.sort(personList, new SortComparator().new PersonCompara());
    }
}
 
例子二:compareable
 
public class PersonWithCompare implements Comparable {
 
    int id;
 
    String name;
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    @Override
    public int compareTo(PersonWithCompare o) {
        if (id == o.getId()) {
            return 0;
        } else if (id > o.getId()) {
            return 1;
        } else {
            return -1;
        }
    }
}
public class SortComparable {
 
    public static void main(String[] args) {
        List personList = new ArrayList ();
        PersonWithCompare person1 = new PersonWithCompare();
        person1.setId(1);
        person1.setName("name1");
        personList.add(person1);
        PersonWithCompare person2 = new PersonWithCompare();
        person2.setId(2);
        person2.setName("name2");
        personList.add(person2);
        PersonWithCompare person3 = new PersonWithCompare();
        person3.setId(3);
        person3.setName("name3");
        personList.add(person3);
        Collections.sort(personList);
    }
}