速览:List.sort(),Stream().sorted():何方技高?
2023-11-30 20:13:30
List.sort() 与 Stream().sorted():性能较量
排序是 Java 开发中一个常见的操作,选择合适的排序方法对性能至关重要。
我们有两种主要选择:list.sort()
和 Stream().sorted()
。让我们深入了解它们的异同以及对性能的影响。
就地排序与新集合创建
list.sort()
直接在集合上执行排序操作。它使用快速排序算法,这是一种高效的原地排序技术。相比之下,Stream().sorted()
使用归并排序算法,需要创建一个新集合来存储排序后的元素。这额外的内存开销和步骤会导致性能下降。
时间复杂度对比
在平均情况下,list.sort()
和 Stream().sorted()
的时间复杂度都是 O(n log n)。但是,由于 list.sort()
在集合本身进行操作,它的常数因子往往更低,在大多数情况下表现得更快。
优化建议
为了获得最佳性能,请考虑以下建议:
- 优先使用
list.sort()
: 在大多数情况下,list.sort()
是排序 Java 集合的更有效选择。 - 选择合适的算法: 对于大型集合或复杂元素,可以探索其他排序算法,如外排序或桶排序。
- 避免多次
Stream().sorted()
调用: 每次调用Stream().sorted()
都会创建一个新集合。如果您需要对同一集合进行多次排序,请使用list.sort()
。
代码示例
以下代码示例比较了 list.sort()
和 Stream().sorted()
的性能:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
public class SortingPerformanceComparison {
public static void main(String[] args) {
// 创建一个大型整数列表
List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
numbers.add((int) (Math.random() * 100000));
}
// 使用 list.sort() 排序列表
long startTime = System.currentTimeMillis();
Collections.sort(numbers);
long endTime = System.currentTimeMillis();
long listSortTime = endTime - startTime;
// 使用 Stream().sorted() 排序列表
startTime = System.currentTimeMillis();
numbers.stream().sorted().toList();
endTime = System.currentTimeMillis();
long streamSortTime = endTime - startTime;
// 打印结果
System.out.println("list.sort() 时间:" + listSortTime + " ms");
System.out.println("Stream().sorted() 时间:" + streamSortTime + " ms");
}
}
常见问题解答
1. 我应该始终使用 list.sort()
吗?
不,对于小型集合或简单元素,Stream().sorted()
可能会提供类似的性能。
2. list.sort()
是否原地修改集合?
是的,list.sort()
会直接修改输入集合。
3. Stream().sorted()
是否创建新的集合?
是的,Stream().sorted()
会创建一个包含排序后元素的新集合。
4. 如果我需要对多个字段进行排序怎么办?
可以使用 Comparator
链将多个排序条件应用于 list.sort()
或 Stream().sorted()
。
5. 我可以定制排序算法吗?
是的,可以通过实现 Comparator
接口来创建自定义排序算法。