首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 排序核心:Comparable 與 Comparator 深度解析與實戰

     編輯:Java 相關知識

Comparable 與 Comparator 皆用於實現集合排序,核心差異在於:

  • Comparable:內部比較,類別自身實作 compareTo 方法,定義「自然順序」(如 String、Integer 已內建比較邏輯)。
  • Comparator:外部比較,透過獨立類別實作 compare 方法,不修改被比較物件類別,實現策略模式。

核心概念對比

特性ComparableComparator
實作位置類別內部外部獨立類別
方法簽名int compareTo(T o)int compare(T o1, T o2)
適用場景單一自然順序多種排序策略、無法修改原類別
設計模式—策略模式

實戰範例:依絕對值排序整數

Integer 預設自然順序為數值大小,若需依絕對值排序,不可修改 Integer 類別,需撰寫 Comparator:

// AbsComparator.java
import java.util.*;

public class AbsComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer o1, Integer o2) {
        int v1 = Math.abs(o1);
        int v2 = Math.abs(o2);
        return Integer.compare(v1, v2); // Java 7+ 推薦寫法
    }
}

測試程式

// Test.java
import java.util.*;

public class Test {
    public static void main(String[] args) {
        Random rnd = new Random();
        Integer[] integers = new Integer[20];
        for (int i = 0; i < integers.length; i++) {
            integers[i] = rnd.nextInt(100) * (rnd.nextBoolean() ? 1 : -1);
        }

        System.out.println("Integer 自然順序排序:");
        Arrays.sort(integers);
        System.out.println(Arrays.asList(integers));

        System.out.println("依絕對值排序:");
        Arrays.sort(integers, new AbsComparator());
        System.out.println(Arrays.asList(integers));
    }
}

關鍵優勢總結

  • Comparable:簡單直觀,賦予物件「可自我比較」能力,適用於單一固定排序邏輯。
  • Comparator:解耦比較邏輯與資料物件,支援多種排序策略動態切換,符合開放封閉原則(對擴充開放,對修改關閉),尤其適合第三方類別或需多種排序規則的場景。

掌握兩者差異與適用時機,能靈活應對各類排序需求,編寫更彈性、可維護的程式碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved