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

Java ArrayList 排序完整指南:Comparator 多條件、Lambda 鏈式與基本類型優化

     編輯:Java 程式設計入門

場景一:自定義對象多條件排序

class Student { String name; int age; /* getter/setter */ }

List list = Arrays.asList(
    new Student("丁曉宇", 21), new Student("趙四", 22),
    new Student("張三", 11), new Student("劉武", 19)
);

// 姓名升序,同年齡升序
list.sort(Comparator.comparing(Student::getName)
                    .thenComparingInt(Student::getAge));

// 年齡降序,同名升序
list.sort(Comparator.comparingInt(Student::getAge).reversed()
                    .thenComparing(Student::getName));

場景二:基本類型 / String 直接排序

List nums = Arrays.asList(5, 2, 8, 1);
nums.sort(Integer::compareTo);           // 升序
nums.sort(Comparator.reverseOrder());    // 降序

List words = Arrays.asList("banana", "apple", "pear");
words.sort(String::compareToIgnoreCase); // 忽略大小寫

場景三:傳統 Comparator 實作類(可復用/序列化)

class AgeComparator implements Comparator, Serializable {
    @Override public int compare(Student s1, Student s2) {
        return Integer.compare(s1.getAge(), s2.getAge());
    }
}
// 使用
list.sort(new AgeComparator());

核心 API 對比表

方法適用優點
Collections.sort(list, cmp)List 介面JDK 7 通用
list.sort(cmp)ArrayList 等預設方法、更 OO
comparing(Function)提取鍵值自動處理 null、可鏈式
thenComparingInt/Long/Double基本型別次鍵避免裝箱、效能高
nullsFirst/Last()空值策略不拋 NPE

避坑指南

  • 減法溢位:s1.age - s2.age → 用 Integer.compare 或 thenComparingInt
  • 違反傳遞性:比較器必須滿足 sgn(c(a,b)) = -sgn(c(b,a)) 且傳遞性
  • 修改排序中對象:不可在比較器中修改被比較對象狀態
  • 穩定性:Collections.sort 為穩定排序(TimSort),相等元素相對位置不變

進階:並行排序大數據

// Java 8+ 數組並行排序
Arrays.parallelSort(arr); // 多核加速

// List 轉數組並行排序後再轉回(或用並行流)
list.parallelStream().sorted(cmp).collect(toList());
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved