← 返回首页

Java中 ArrayList排序方式

在 Java 中,对 ArrayList 进行排序有多种常见方式。以下是几种主流且实用的排序方法:

1. 使用 Collections.sort() 方法

这是最经典、最常用的排序方式。它可以直接对列表进行原地排序(即直接修改原列表的顺序)。

  • 自然排序:如果列表元素是基础类型(如 String, Integer)或已实现 Comparable 接口的自定义对象,可直接调用单参数方法,默认按升序排列。
    List<String> names = Arrays.asList("Charlie", "Alice", "Bob");
    Collections.sort(names); 
    // 结果: [Alice, Bob, Charlie]
  • 自定义排序(Lambda表达式):当需要按特定规则排序时,可以传入一个比较器(Java 8+ 推荐使用 Lambda 表达式简化代码)。
    List<Person> people = new ArrayList<>();
    // 按年龄降序排序
    Collections.sort(people, (p1, p2) -> Integer.compare(p2.getAge(), p1.getAge()));

2. 使用 List.sort() 方法

Java 8 为 List 接口新增了默认的 sort() 方法。它的底层实现与 Collections.sort() 完全相同,但语法更加简洁,直接在列表对象上调用即可。

List<String> fruits = new ArrayList<>(Arrays.asList("Banana", "Apple", "Cherry"));
fruits.sort(Comparator.naturalOrder()); // 升序

3. 使用 Stream API 进行排序

如果你希望在排序的同时保留原始列表不变,或者需要进行链式操作(如过滤、映射等),可以使用 Stream API。它会返回一个全新的排序后列表。

List<Person> sortedPeople = people.stream()
        .sorted(Comparator.comparing(Person::getAge).reversed()) // 按年龄降序
        .collect(Collectors.toList());

进阶技巧与避坑指南

在实际业务开发中,使用排序时还需要注意以下几个关键点:

  • 多字段组合排序:可以使用 Comparator 的静态方法进行链式构建,语义非常清晰。例如“先按年龄升序,年龄相同再按分数降序”:
    Comparator<User> comparator = Comparator.comparing(User::getAge)
            .thenComparing(User::getScore, Comparator.reverseOrder());
    Collections.sort(users, comparator);
  • 处理 null 值:真实数据中常包含 null 字段,直接比较会抛出空指针异常(NullPointerException)。应显式控制 null 的排序位置:
    // 将 null 值排在最后
    Comparator.comparing(User::getName, Comparator.nullsLast(String::compareTo))
  • 确保列表可修改:所有的 sort() 方法都是原地修改。如果传入的是不可变列表(如通过 List.of() 或 Collections.unmodifiableList() 创建的列表),会抛出 UnsupportedOperationException 异常。安全做法是对不确定来源的列表先创建副本:new ArrayList<>(originalList)。