最簡單的排序寫法
import java.util.Arrays;
String[] fruits = {"banana", "apple", "cherry", "date"};
Arrays.sort(fruits); // 就地排序,無回傳值
System.out.println(Arrays.toString(fruits));
// 輸出: [apple, banana, cherry, date]
排序規則詳解
預設:自然順序
String 實作 Comparable<String>,按 Unicode 碼位序 比較。
- 順序:數字 (0-9) < 大寫字母 (A-Z) < 小寫字母 (a-z)。
String[] mixed = {"abc", "ABC", "123", "Abc"};
Arrays.sort(mixed);
// 結果: [123, ABC, Abc, abc]
自訂排序:Comparator
// 忽略大小寫
Arrays.sort(fruits, String.CASE_INSENSITIVE_ORDER);
// 依長度排序
Arrays.sort(fruits, Comparator.comparingInt(String::length));
// 多層次:先長度,再字典序
Arrays.sort(fruits, Comparator
.comparingInt(String::length)
.thenComparing(Comparator.naturalOrder()));
// 反序
Arrays.sort(fruits, Comparator.reverseOrder());
進階用法
部分範圍排序
String[] arr = {"e", "d", "c", "b", "a"};
Arrays.sort(arr, 1, 4); // 只排索引 1~3 (d,c,b -> b,c,d)
// 結果: [e, b, c, d, a]
平行排序 (Java 8+)
// 大陣列 (超過 8192 元素) 會自動啟用多執行緒
Arrays.parallelSort(hugeArray);
避免修改原陣列
String[] sorted = Arrays.stream(original)
.sorted()
.toArray(String[]::new);
// 或
String[] sorted = original.clone();
Arrays.sort(sorted);
底層演算法
| 陣列類型 | 演算法 | 複雜度 | 穩定性 |
| 物件 (String 等) | TimSort (合併排序 + 插入排序) | O(n log n) | 穩定 |
| 基本型別 (int[] 等) | Dual-Pivot Quicksort | O(n log n) | 不穩定 |
TimSort 利用資料既有有序片段,對近乎有序資料極快 (O(n))。
常見陷阱
- ❌
Arrays.sort(null) → NullPointerException
- ❌ 陣列含
null 元素 → NullPointerException (自然順序)
- ✅ 處理 null:
Arrays.sort(arr, Comparator.nullsFirst(Comparator.naturalOrder()))
- ❌ 期望回傳新陣列 →
Arrays.sort() 回傳 void
效能微調建議
- 小陣列 (< 50) 插入排序更快,TimSort 內建此優化。
- 大陣列且多核 CPU →
parallelSort()。
- 頻繁排序同一陣列 → 重複使用
Comparator 實例避免物件分配。
- 自訂比較器盡量簡單,避免在
compare() 做重運算。
完整範例程式
import java.util.*;
public class StringArraySortDemo {
public static void main(String[] args) {
String[] data = {"delta", "Alpha", "epsilon", "beta", "Gamma", "123"};
System.out.println("原始: " + Arrays.toString(data));
// 1. 自然順序
Arrays.sort(data);
System.out.println("自然序: " + Arrays.toString(data));
// 2. 忽略大小寫
Arrays.sort(data, String.CASE_INSENSITIVE_ORDER);
System.out.println("忽略大小寫: " + Arrays.toString(data));
// 3. 依長度
Arrays.sort(data, Comparator.comparingInt(String::length));
System.out.println("依長度: " + Arrays.toString(data));
// 4. 部分排序
String[] part = data.clone();
Arrays.sort(part, 0, 3);
System.out.println("前3排序: " + Arrays.toString(part));
}
}
總結
Arrays.sort(String[]) 是排序字串陣列的標準、高效方式。
- 預設 Unicode 碼位序:數字 < 大寫 < 小寫。
- 靈活運用
Comparator 實現忽略大小寫、長度、多鍵值、反序等需求。
- 注意
null 元素與 void 回傳值特性。
- 大資料量善用
parallelSort() 發揮多核效能。
下次需要排序字串陣列,直接 Arrays.sort(arr) 走起!
- 上一篇文章: Java Deflate 壓縮/解壓縮實作指南:Deflater 與 Inflater 完整範例
- 下一篇文章: MyBatis 批量插入兩大高效方案:foreach vs ExecutorType.BATCH 深度比較
Copyright ©
程式碼之家 All Rights Reserved