java中的排序方法
在 Java 中,排序是一个非常常见的操作。Java 提供了多种排序方法,适用于不同的数据类型和场景。下面我们系统、全面地介绍 Java 中的排序方法,包括:
- 数组排序
- 集合排序
- 自定义排序
- 并行排序
- Lambda 表达式排序
- 稳定性与算法原理
🧱 一、Java 排序的核心方式(4 大类)
类别 | 适用对象 | 主要方法 |
---|---|---|
1. Arrays.sort() | 数组(基本类型、对象数组) | Arrays.sort(arr) |
2. Collections.sort() | 集合(List) | Collections.sort(list) |
3. List.sort() | List 接口自带 | list.sort(comparator) |
4. Stream.sorted() | 流式处理 | stream.sorted() |
📌 二、详细用法与示例
✅ 1. Arrays.sort()
—— 排序数组
(1) 基本类型数组(升序)
int[] arr = {5, 2, 8, 1, 9};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // [1, 2, 5, 8, 9]
⚠️ 基本类型(
int[]
,double[]
,char[]
等)不支持逆序,需手动处理。
(2) 对象数组(如 String[]
)
String[] names = {"Alice", "Bob", "Charlie"};
Arrays.sort(names); // 按字典序
System.out.println(Arrays.toString(names)); // [Alice, Bob, Charlie]
(3) 自定义排序(使用 Comparator
)
Integer[] nums = {5, 2, 8, 1, 9};
// 降序排列
Arrays.sort(nums, Comparator.reverseOrder());
System.out.println(Arrays.toString(nums)); // [9, 8, 5, 2, 1]// 按绝对值排序
Integer[] arr = {-3, -1, 4, 2};
Arrays.sort(arr, (a, b) -> Integer.compare(Math.abs(a), Math.abs(b)));
System.out.println(Arrays.toString(arr)); // [-1, 2, -3, 4]
✅ 2. Collections.sort()
—— 排序 List 集合
List<String> list = Arrays.asList("Charlie", "Alice", "Bob");
Collections.sort(list);
System.out.println(list); // [Alice, Bob, Charlie]// 降序
Collections.sort(list, Comparator.reverseOrder());
✅ 适用于
ArrayList
,LinkedList
等实现了List
接口的集合。
✅ 3. List.sort()
—— List 自带排序(推荐)
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 30));
people.add(new Person("Charlie", 20));// 按年龄排序
people.sort(Comparator.comparing(Person::getAge));
System.out.println(people);
✅ 这是 Java 8+ 推荐方式,更简洁。
✅ 4. Stream.sorted()
—— 流式排序(函数式编程)
List<String> sorted = list.stream().sorted() // 升序.collect(Collectors.toList());// 按长度排序
List<String> byLength = list.stream().sorted(Comparator.comparing(String::length)).collect(Collectors.toList());// 逆序
List<String> reversed = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
✅ 优势:链式调用、延迟执行、可组合过滤等操作。
🎯 三、自定义对象排序(实现 Comparable
或 Comparator
)
方式 1:实现 Comparable
接口(自然排序)
public class Person implements Comparable<Person> {private String name;private int age;@Overridepublic int compareTo(Person other) {return Integer.compare(this.age, other.age); // 按年龄排序}
}
List<Person> list = ...;
Collections.sort(list); // 自动按 age 排序
方式 2:使用 Comparator
(更灵活)
// 按姓名排序
list.sort(Comparator.comparing(Person::getName));// 多字段排序:先按年龄,再按姓名
list.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));
🔁 四、逆序(降序)排序方法
方法 | 示例 |
---|---|
Comparator.reverseOrder() | list.sort(Comparator.reverseOrder()) |
Collections.reverseOrder() | Collections.sort(list, Collections.reverseOrder()) |
reversed() | Comparator.comparing(Person::getAge).reversed() |
list.sort(Comparator.comparing(Person::getAge).reversed()); // 年龄从大到小
⚡ 五、并行排序(Java 8+)
适用于大数据量排序,利用多核 CPU。
int[] largeArray = new int[1_000_000];
// 填充数据...// 并行排序(基本类型)
Arrays.parallelSort(largeArray);// 并行排序(对象)
Person[] persons = ...;
Arrays.parallelSort(persons, Comparator.comparing(Person::getAge));
✅ 原理:使用 并行归并排序(Parallel Merge Sort)
🧮 六、排序算法原理(Java 内部实现)
Java 的排序算法根据数据类型和大小自动选择:
类型 | 算法 | 特点 |
---|---|---|
int[] , long[] 等基本类型 | 双轴快排(Dual-Pivot Quicksort) | 快,但不稳定 |
Integer[] , String[] 等对象数组 | TimSort(归并 + 插入) | 稳定,适合部分有序数据 |
小数组(< 47) | 插入排序 | 简单高效 |
极大数据 | 并行归并排序 | 利用多线程 |
✅ TimSort 是 Python 和 Java 集合排序的默认算法,稳定且性能优秀。
📊 七、稳定性对比
方法 | 是否稳定 |
---|---|
Arrays.sort(Object[]) | ✅ 是(TimSort) |
Arrays.sort(int[]) | ❌ 否(双轴快排) |
Collections.sort() | ✅ 是 |
List.sort() | ✅ 是 |
Stream.sorted() | ✅ 是 |
✅ 稳定排序:相等元素的相对位置不变。
🚫 八、注意事项
-
null 值处理:
Comparator.nullsFirst()
/nullsLast()
list.sort(Comparator.comparing(Person::getName, Comparator.nullsLast(String::compareTo)));
-
不可变集合排序:
- 先
stream().sorted().collect()
生成新集合
- 先
-
性能建议:
- 小数据量:
sort()
- 大数据量:
parallelSort()
- 频繁排序:考虑使用
TreeSet
或PriorityQueue
- 小数据量:
✅ 九、总结:Java 排序方法一览表
方法 | 适用对象 | 是否稳定 | 是否支持 Lambda | 推荐场景 |
---|---|---|---|---|
Arrays.sort(arr) | 数组 | 基本类型 ❌,对象 ✅ | ✅ | 通用数组排序 |
Collections.sort(list) | List | ✅ | ✅ | 集合排序(传统) |
list.sort(comp) | List | ✅ | ✅ | 推荐,Java 8+ |
stream.sorted() | Stream | ✅ | ✅ | 流式处理、链式调用 |
Arrays.parallelSort() | 大数组 | 对象 ✅ | ✅ | 大数据并行排序 |
🎁 十、一句话口诀
小数组用
sort
,大数组用parallelSort
;
集合用list.sort()
,流式用stream.sorted()
;
自定义排序靠Comparator
,多字段用thenComparing
。