java Comparable 和 Comparator接口区别

Posted chenzquan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java Comparable 和 Comparator接口区别相关的知识,希望对你有一定的参考价值。

Comparable 简介

Comparable 是排序接口。

若一个类实现了Comparable接口,就意味着“该类支持排序”。  即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。

此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。

 

Comparable 定义

Comparable 接口仅仅只包括一个函数,它的定义如下:

package java.lang;
import java.util.*;

public interface Comparable<T> {
    public int compareTo(T o);
}

说明:
假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。

 

Comparator 简介

Comparator 是比较器接口。

我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。

也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

 

Comparator 定义

Comparator 接口仅仅只包括两个个函数,它的定义如下:

复制代码
package java.util;

public interface Comparator<T> {

    int compare(T o1, T o2);

    boolean equals(Object obj);
}
复制代码

说明:
(01) 若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。

        为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以,其它所有的类也相当于都实现了该函数。

(02) int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

 

 

Comparator 和 Comparable 比较

Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

我们不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

 

例子:

public class CompareComparatorAndComparableTest {
    public static void main(String [] args) {
        ArrayList<Person> list = new ArrayList<Person>();
        list.add(new Person("cccc",20));
        list.add(new Person("dssdfj",30));
        list.add(new Person("vvv",10));
        list.add(new Person("ssss",50));
    
        System.out.println("original sort: list " + list);
        Collections.sort(list);
        System.out.println("after sort list by name : " + list);
        
        Collections.sort(list,new AscAgeComparator());
        System.out.println("after asc_sort by age: " + list);
        
        Collections.sort(list,new DscAgeComparator());
        System.out.println("after dsc_sort by age: " + list);
    }
}


class Person implements Comparable<Person>{
    int age;
    String name;
    public Person() {
        age = 0;
        name = "";
    }
    
    public Person(String name,int age) {
        this.age = age;
        this.name = name;
    }
    
    public int getAge() {
        return age;
    }
    
    public String getName() {
        return name;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return name + ": " + age;
    }

    @Override
    public int compareTo(Person o) {
        
        return name.compareTo(o.name);
    }
}


class AscAgeComparator implements Comparator<Person>{

    @Override
    public int compare(Person o1, Person o2) {
        // TODO Auto-generated method stub
        return o1.age - o2.age;
    }
}

class DscAgeComparator implements Comparator<Person>{

    @Override
    public int compare(Person o1, Person o2) {
        // TODO Auto-generated method stub
        return o2.age - o1.age;
    }
    
}

 

以上是关于java Comparable 和 Comparator接口区别的主要内容,如果未能解决你的问题,请参考以下文章

Java 中 Comparable 和 Comparator 比较

java源码之Comparable和Comparator

java Comparable 和 Comparator接口区别

Java:Comparable和Comparator区别

Java中Comparable和Comparator接口区别分析

Java中Comparable和Comparator