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

Java 物件排序三大實作方式完整比較

     編輯:Java 相關知識

三種排序 API 對照

方法適用集合物件需實作比較器位置
Collections.sort(List, Comparator)List無外部 Comparator
Arrays.sort(Object[])陣列Comparable物件內部 compareTo
Collections.sort(List)ListComparable物件內部 compareTo

完整可執行範例

import java.util.*;

public class ObjectSortDemo {
    public static void main(String[] args) {
        // 測試資料
        Person[] people = {
            new Person("P0", 0), new Person("P1", 3), new Person("P2", 5),
            new Person("P3", 4), new Person("P4", 8), new Person("P5", 6),
            new Person("P6", 7), new Person("P7", 1), new Person("P8", 2),
            new Person("P9", 9)
        };

        // 方式 1:Collections.sort + Comparator(外部比較策略)
        List list1 = new ArrayList<>(Arrays.asList(people));
        System.out.print("原始順序:");
        list1.forEach(p -> System.out.print(p.getAge()));
        long t1 = System.currentTimeMillis();
        Collections.sort(list1, new AgeComparator());
        System.out.println("\n方式1 耗時:" + (System.currentTimeMillis() - t1) + "ms");
        list1.forEach(p -> System.out.print(p.getAge()));

        // 方式 2:Arrays.sort + Comparable(陣列原地排序)
        Person[] arr2 = Arrays.copyOf(people, people.length);
        System.out.print("\n\n方式2 陣列排序:");
        long t2 = System.currentTimeMillis();
        Arrays.sort(arr2);
        System.out.println("耗時:" + (System.currentTimeMillis() - t2) + "ms");
        for (Person p : arr2) System.out.print(p.getAge());

        // 方式 3:Collections.sort(List) + Comparable
        List list3 = new ArrayList<>(Arrays.asList(Arrays.copyOf(people, people.length)));
        System.out.print("\n\n方式3 List排序:");
        long t3 = System.currentTimeMillis();
        Collections.sort(list3);
        System.out.println("耗時:" + (System.currentTimeMillis() - t3) + "ms");
        list3.forEach(p -> System.out.print(p.getAge()));
    }
}

// 外部比較器
class AgeComparator implements Comparator {
    public int compare(Person p1, Person p2) {
        return Integer.compare(p1.getAge(), p2.getAge());
    }
}

// 可比較物件(內建自然順序)
class Person implements Comparable {
    private String name; private int age;
    public Person(String name, int age) { this.name = name; this.age = age; }
    public String getName() { return name; }
    public int getAge() { return age; }
    @Override public int compareTo(Person o) {
        return Integer.compare(this.age, o.age);
    }
}

選擇指南

  • 需多種排序規則(如按年齡、姓名、薪資):用 Comparator 實作不同策略,搭配 Collections.sort(list, comparator)。
  • 單一自然順序(如 ID、年齡為主鍵):實作 Comparable,直接用 Collections.sort(list) 或 Arrays.sort(array)。
  • 效能考量:陣列排序(Arrays.sort)略快於 List 轉陣列再排;Comparable 避免額外物件建立,微幅優於 Comparator。
  • Java 8+ 最佳實務:list.sort(Comparator.comparing(Person::getAge)) 或 list.sort(Comparator.comparingInt(Person::getAge)),Lambda 簡潔且無裝箱開銷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved