Comparable 和 Comparator 都是接口,可用于对集合元素进行排序。但是,下面给出的 Comparable 和 Comparator 接口之间存在许多差异。

Comparable Comparator
Comparable 提供单一排序序列。可以根据单个元素(例如 id、name 和 price)对集合进行排序。 Comparator提供多种排序序列,可以根据 id、name 和 price 等多个元素对集合进行排序。
Comparable 影响原始类,即修改了实际类。 Comparator不影响原始类,即不修改实际类。
Comparable 提供 compareTo() 方法对元素进行排序。 Comparator 提供了 compare() 方法来对元素进行排序。
Comparable 存在于 java.lang 包中。 Comparator存在于 java.util 包中。
可以通过 Collections.sort(List) 方法对 Comparable 类型的列表元素进行排序。 可以通过 Collections.sort(List, Comparator) 方法对 Comparator 类型的列表元素进行排序。

Java Comparable 示例

让我们看一个 Comparable 接口的例子,它根据 age 对列表元素进行排序。

文件:TestComparableSort3.java

import java.util.*;
import java.io.*;
class Student implements Comparable<Student>{
    int rollno;
    String name;
    int age;
    Student(int rollno,String name,int age){
        this.rollno=rollno;
        this.name=name;
        this.age=age;
    }

    public int compareTo(Student st){
        if(age==st.age)
            return 0;
        else if(age>st.age)
            return 1;
        else
            return -1;
    }

}

public class TestSort3{
    public static void main(String args[]){
        ArrayList<Student> al=new ArrayList<Student>();
        al.add(new Student(101,"Vijay",23));
        al.add(new Student(106,"Ajay",27));
        al.add(new Student(105,"Jai",21));

        Collections.sort(al);
        for(Student st:al){
            System.out.println(st.rollno+" "+st.name+" "+st.age);
        }
    }
}

Java Comparator示例

下面让我们看一个 Java Comparator 接口的示例,示例中使用不同的Comparator对列表的元素进行排序。

Student.java

class Student{  
    int rollno;  
    String name;  
    int age;  
    Student(int rollno,String name,int age){  
        this.rollno=rollno;  
        this.name=name;  
        this.age=age;  
    }  
}  

AgeComparator.java

import java.util.*;  
class AgeComparator implements Comparator<Student>{  
    public int compare(Student s1,Student s2){  
        if(s1.age==s2.age)  
        return 0;  
        else if(s1.age>s2.age)  
        return 1;  
        else  
        return -1;  
    }  
}  

NameComparator.java

此类提供基于 name 的比较逻辑。 在这种情况下使用 String 类的 compareTo() 方法,它在内部提供比较逻辑。

import java.util.*;  
class NameComparator implements Comparator<Student>{  
    public int compare(Student s1,Student s2){  
        return s1.name.compareTo(s2.name);  
    }  
}  

TestComparator.java 在这个类中,我们通过根据 name 和 age 排序来打印对象的值。

//Java Program to demonstrate the use of Java Comparator  
import java.util.*;  
import java.io.*;  
class TestComparator{  
    public static void main(String args[]){  
        //Creating a list of students  
        ArrayList<Student> al=new ArrayList<Student>();  
        al.add(new Student(101,"Zhangsan",23));  
        al.add(new Student(106,"Lisi",27));  
        al.add(new Student(105,"JaiWu",21));  

        System.out.println("Sorting by Name");  
        //Using NameComparator to sort the elements  
        Collections.sort(al,new NameComparator());  
        //Traversing the elements of list  
        for(Student st: al){  
        System.out.println(st.rollno+" "+st.name+" "+st.age);  
        }  

        System.out.println("sorting by Age");  
        //Using AgeComparator to sort the elements  
        Collections.sort(al,new AgeComparator());  
        //Travering the list again  
        for(Student st: al){  
        System.out.println(st.rollno+" "+st.name+" "+st.age);  
        }  

    }  
}  
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:Comparable 和 Comparator 的区别
本文链接:https://www.vsdiffer.com/vs/comparable-vs-comparator.html
免责声明:以上内容仅是站长个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。