[Java] Comparable vs Comparator

阅读时间: 10分钟

Comparable与Comparator的功能相近,但其实有不同的地方。
大家可以因应需求而选择最好的方式。

首先它们有5个不同地方:
1, Comparable只可被用作物件中一个属性的自然排序。
Comparator可被用作不同物件不同属性的排序。

2, Comparable用“this” reference 与指定物件作比较。
Comparator用两个不同的物件做比较。

3, Comparable在java.lang package内。
Comparator在java.util package内。

4, Comparable需要修改原来的class。
Comparator不需要修改原来的class。

5, Comparable提供compareTo() method来排序元素。
Comparator提供compare() method 和equals() method来排序元素。

这样说可能会比较抽象,
大家可以看看以下例子。
相信大家看完之后会明白它们两者实际的区别了。

例子:

import java.io.*; import java.util.*;   // Class 'Movie' 实作Comparable interfaceclass Movie implements Comparable<Movie> {     private double rating;     private String name;     private int year;       // 用年份排序    public int compareTo(Movie m)     {         return this.year - m.year;     }       // Constructor     public Movie(String nm, double rt, int yr)     {         this.name = nm;         this.rating = rt;         this.year = yr;     }       // Getter methods 目的是存取private元素rating、name、year。    public double getRating() { return rating; }     public String getName()   {  return name; }     public int getYear()      {  return year;  } }   // Class 比较ratingclass RatingCompare implements Comparator<Movie> {     public int compare(Movie m1, Movie m2)     {         if (m1.getRating() < m2.getRating()) return -1;         if (m1.getRating() > m2.getRating()) return 1;         else return 0;     } }   // Class 比较nameclass NameCompare implements Comparator<Movie> {     public int compare(Movie m1, Movie m2)     {         return m1.getName().compareTo(m2.getName());     } }   // 主classclass Main {     public static void main(String[] args)     {         ArrayList<Movie> list = new ArrayList<Movie>();         list.add(new Movie("Force Awakens", 8.3, 2015));         list.add(new Movie("Star Wars", 8.7, 1977));         list.add(new Movie("Empire Strikes Back", 8.8, 1980));         list.add(new Movie("Return of the Jedi", 8.4, 1983));           // 以rating排序 :         // (1) 创建物件ratingCompare         // (2) 使用Collections.sort         // (3) 列印Sorted list         System.out.println("Sorted by rating");         RatingCompare ratingCompare = new RatingCompare();         Collections.sort(list, ratingCompare);         for (Movie movie: list)             System.out.println(movie.getRating() + " " +                                movie.getName() + " " +                                movie.getYear());             // 以name排序        // (1) 创建物件nameCompare        // (2) 使用Collections.sort         // (3) 列印Sorted list         System.out.println("\nSorted by name");         NameCompare nameCompare = new NameCompare();         Collections.sort(list, nameCompare);         for (Movie movie: list)             System.out.println(movie.getName() + " " +                                movie.getRating() + " " +                                movie.getYear());           //以year排序        System.out.println("\nSorted by year");         Collections.sort(list);         for (Movie movie: list)             System.out.println(movie.getYear() + " " +                                movie.getRating() + " " +                                movie.getName()+" ");     } }   

参考文章/网站/书本:

Comparable vs Comparator in Java

Comparable and Comparator in Java

Java Comparable Example for Natural Order Sorting

Comparable Interface

Comparable in Java


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章