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

Java Collections 工具類核心:sort 排序原理、Comparable 與 Comparator 實戰、中文排序方案

     編輯:Java 綜合教學

Java Collections 工具類核心:sort 排序原理、Comparable 與 Comparator 實戰、中文排序方案

java.util.Collections 是操作集合的工具類,所有方法均為 static。核心方法 sort(List) 支援自然順序與自定義比較器兩種模式。本文深度解析泛型簽名、排序演算法、Comparator 實現技巧,並提供 Java/PHP 雙語言對比代碼。

一、Collections.sort 方法簽名解析

// 自然順序:元素必須實現 Comparable
public static > void sort(List list)

// 自定義比較器:傳入 Comparator
public static  void sort(List list, Comparator c)
泛型通配符解讀:? super T 表示比較器能比較 T 及其父類型,體現逆變特性,允許傳入比較範圍更大的比較器(如 Comparator 比較 String 列表)。

二、自然順序排序實戰

List list = Arrays.asList("aaa", "ccc", "bbb", "eee");
Collections.sort(list);  // 字典序
System.out.println(list); // [aaa, bbb, ccc, eee]

List chinese = Arrays.asList("陶", "士", "涵");
Collections.sort(chinese);  // 按 Unicode/ASCII 碼值排序
System.out.println(chinese); // [士, 涵, 陶]  ← 非拼音序!

三、自定義 Comparator:按字符串長度排序

List list3 = Arrays.asList("aaa", "c", "bb", "eeee");

// 方式 1:匿名內部類(Java 7 風格)
Collections.sort(list3, new Comparator() {
    @Override public int compare(String o1, String o2) {
        int lenDiff = o1.length() - o2.length();
        return lenDiff != 0 ? lenDiff : o1.compareTo(o2);  // 長度相同按字典序
    }
});

// 方式 2:Lambda 表達式(Java 8+ 推薦)
Collections.sort(list3, (o1, o2) -> {
    int lenDiff = o1.length() - o2.length();
    return lenDiff != 0 ? lenDiff : o1.compareTo(o2);
});

// 方式 3:Comparator 靜態工廠方法鏈(Java 8+ 最優雅)
Collections.sort(list3, Comparator
    .comparingInt(String::length)
    .thenComparing(Comparator.naturalOrder())
);

System.out.println(list3); // [c, bb, aaa, eeee]

四、中文排序:RuleBasedCollator 方案

import java.text.Collator;
import java.text.RuleBasedCollator;
import java.util.*;

List names = Arrays.asList("張三", "李四", "王五", "趙六");
Collections.sort(names, (o1, o2) -> {
    RuleBasedCollator collator = (RuleBasedCollator) Collator.getInstance(Locale.CHINA);
    return collator.getCollationKey(o1).compareTo(collator.getCollationKey(o2));
});
System.out.println(names); // [李四, 王五, 張三, 趙六]  ← 按拼音序

五、PHP 對比實現(usort + 自定義比較函數)

六、性能與避坑指南

場景建議原因
大數據量排序優先用 List.sort(Comparator)(Java 8+)避免舊版 Collections.sort 內部轉數組再複製回列表的開銷
基本類型數組用 Arrays.sort(int[]) 而非包裝類 List避免裝箱/拆箱與對象頭開銷
穩定性要求Java 8+ TimSort 穩定排序相等元素相對位置不變,利於多關鍵字排序
比較器複用定義為 static final 常量或單例避免重複創建對象,利於 JIT 內聯優化

七、Collections 其他常用靜態方法速查

方法功能
reverse(List)反轉列表順序
shuffle(List)隨機打亂順序
max/min(Collection)獲取最大/最小元素
frequency(Collection, Object)統計元素出現次數
binarySearch(List, key)二分查找(列表必須有序)
synchronizedList/Set/Map返回線程安全包裝視圖
unmodifiableList/Set/Map返回不可修改視圖(防御性編程)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved