Java中的sort()排序详解
排序是编程中最常见的操作之一,无论是对数组、集合,还是对自定义对象,都会遇到排序需求。Java 提供了多种排序方法,涵盖基础数组排序、集合排序,以及自定义排序规则。本文将系统介绍 Java 中 sort()
的多种用法,深入讲解排序原理、代码示例与实战技巧。
首先需要明确的是:sort
方法定义如下(Java 8 中 List
接口):
void sort(Comparator<? super E> c);
其中 Comparator
是一个函数式接口,它只有一个抽象方法:
int compare(T o1, T o2);
其中对于compare
T
:是要比较的对象类型(例如String
,Integer
,Person
等)o1
、o2
:是要进行比较的两个对象返回值是一个整数,用于表示它们的大小关系:
小于0:升序,大于0:降序
返回值 | 含义 |
---|---|
< 0(负数) | o1 小于 o2(o1 排在前面) |
= 0(零) | o1 等于 o2(不影响顺序) |
> 0(正数) | o1 大于 o2(o2 排在前面) |
一、数组排序:Arrays.sort()
Java 的 Arrays.sort()
是对数组进行排序的基础方法,适用于基本数据类型数组和对象数组。
1. 基本数据类型数组排序
对整型、浮点型、字符型数组进行排序,只需调用:
int[] nums = {5, 3, 8, 1, 4};
Arrays.sort(nums);
System.out.println(Arrays.toString(nums)); // 输出:[1, 3, 4, 5, 8]
该方法内部对原始类型数组采用的是基于双枢轴快速排序(Dual-Pivot Quicksort),平均时间复杂度为 O(n log n),性能优良。
2. 对象数组排序
对于对象数组,如 String[]
,默认按自然顺序(字典序)排序:
String[] fruits = {"Banana", "Apple", "Orange"};
Arrays.sort(fruits);
System.out.println(Arrays.toString(fruits)); // 输出:[Apple, Banana, Orange]
3. 自定义排序规则
如果需要基于某种业务逻辑排序,比如字符串长度,可以传入 Comparator
:
Arrays.sort(fruits, (a, b) -> a.length() - b.length());
System.out.println(Arrays.toString(fruits)); // 输出:[Apple, Banana, Orange]
这里使用了 Lambda 表达式,等价于实现 Comparator<String>
的匿名类。
二、集合排序:Collections.sort()
和 List.sort()
1. Collections.sort()
简介
Java 集合框架中的 Collections.sort()
方法用于对 List
进行排序。其底层实现调用了 List
自身的 sort()
方法。
List<Integer> list = Arrays.asList(5, 2, 7, 1);
Collections.sort(list);
System.out.println(list); // 输出:[1, 2, 5, 7]
2. 自定义排序规则
同样支持传入 Comparator
来实现复杂排序逻辑:
Collections.sort(list, (a, b) -> b - a);
System.out.println(list); // 输出:[7, 5, 2, 1]
3. Java 8+ 推荐使用 List.sort()
Java 8 引入了 List
接口的 sort()
方法,支持直接用 Lambda 表达式,代码更简洁:
list.sort(Integer::compareTo); // 升序
list.sort(Comparator.reverseOrder()); // 降序