返回

速览:List.sort(),Stream().sorted():何方技高?

后端

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 接口来创建自定义排序算法。