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;
    }

}

原文地址:https://www.cnblogs.com/zquan/p/9374595.html

时间: 2024-08-02 20:13:44

java Comparable 和 Comparator接口区别的相关文章

Java中Comparable和Comparator接口区别分析

Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧.Comparable 简介Comparable 是排序接口.若一个类实现了Comparab 本文要来详细分析一下Java中Comparable和Comparator接口的区别,

java Comparable与Comparator接口辨析

当可以接触到类的源码时,实现Comparable接口,重写public int compareTo(T o)函数. 这可以使类本身变得可比较(comparable), 可以用Collections.sort()排序,可以当map的key. 当不可接触到类的源码时,又想对类进行排序,可以实现Comparator接口.它是一个比较器,指导Collections.sort()等方法对对象排序. 这时需要实现 int compare (T o1, T o2).实现后我们可以将Comparator传递给C

【Java基础】接口Comparable和Comparator的区别和关系

接口Comparable和Comparator的区别和关系 1).两者都是实现集合中元素的比较.排序: 2).Comparable是集合内部定义方法实现排序,Comparator是集合外部实现排序 3).Comparator接口在java.util下,Comparable接口在java.lang下; 通常自定义类加入如List等容器中能够排序,可以实现Comparable接口,在用Collections.sort(List<T> list, Comparator<? super T>

Java中Comparable与Comparator的区别

相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都是Java的接口 区别 Comparator位于java.util包下,而Comparable位于java.lang包下 Comparable接口的实现是在类的内部(如 String.Integer已经实现了Comparable接口,自己就可以完成比较大小操作),Comparator接口的实现是在类

Java 解惑:Comparable 和 Comparator 的区别

读完本文你将了解到: Comparable 自然排序 Comparator 定制排序 总结 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下. Comparable 自然排序 Comparable 在 java.lang 包下,是一个接口,内部只有一个方法 compareTo(): public interface Comparable<T> { public int compareTo(T o); } Comparab

Comparable和Comparator的区别

原文地址:http://leihuang.org/2014/11/16/Comparable-Vs-Comparator/ Comparable和Comparator都是用来实现集合中元素的比较.排序的,只是Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法. Comparator位于包java.util下,而Comparab

【Java】Comparable和Comparator接口的区别

Java提供了只包含一个compareTo()方法的Comparable接口.这个方法可以个给两个对象排序.具体来说,它返回负数,0,正数来表明已经存在的对象小于,等于,大于输入对象. Java提供了包含compare()和equals()两个方法的Comparator接口. compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数. equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等.只有当输入参数也是一

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序

一.描述 自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序. 这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序. 另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,

Java学习之Comparable与Comparator的区别

Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法.Comparator位于包java.util下,而Comparable位于包   java.lang下Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 Stri