- //升序排序 List<T> ,T为数字或字符串
- Collections.sort(list);
- //降序排序
- Collections.sort(list,Collections.reverseOrder());
-
基于jdk.18
- import lombok.Data;
-
- @Data
- public class User {
-
- private int id;
- private int age;
- private String name;
-
- public User(int id, int age, String name) {
- this.id = id;
- this.name = name;
- this.age = age;
- }
-
- }
Comparator 是类外部的比较器。使用此可构造一个可拓展的工具,无需修改原类。实现方法有两种:
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.List;
-
- public class SortTest {
-
- public static void main(String[] args) {
- // 初始化数据
- List
list = new ArrayList() {{ - add(new User(1, 43, "北京"));
- add(new User(2, 16, "天津"));
- add(new User(3, 33, "石家庄"));
- add(new User(4, 27, "深圳"));
- }};
-
- // 使用 Comparator 比较器排序
- Collections.sort(list, new UserComparator());
- // 打印 list 集合
- list.forEach(p -> {System.out.println(p);});
-
- }
- }
- /**
- * 构建User比较器
- */
- class UserComparator implements Comparator
{ - @Override
- //正数排前
- public int compare(User p1, User p2) {
- return p1.getAge() - p2.getAge();
- }
- }
结果如下图所示:
比较器Comparator可以使用匿名类的方式,更加简洁的实现排序,代码如下:
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.List;
-
- public class SortTest {
-
- public static void main(String[] args) {
- // 初始化数据
- List
list = new ArrayList() {{ - add(new User(1, 43, "北京"));
- add(new User(2, 16, "天津"));
- add(new User(3, 33, "石家庄"));
- add(new User(4, 27, "深圳"));
- }};
-
- // 使用 Comparator 的匿名内部类 比较器排序
- Collections.sort(list, new Comparator
(){ - @Override
- //倒数排前
- public int compare(User p1, User p2) {
- return p2.getAge() - p1.getAge();
- }
- });
- // 打印 list 集合
- list.forEach(p -> {System.out.println(p);});
-
- }
- }
结果如下图所示 
- //按照List中对象的id属性升序,默认升序
- list.sort(Comparator.comparing(User::getId));
-
- //按照List中对象的id属性降序
- list.sort(Comparator.comparing(User::getId).reversed());
-
- //多条件升序
- list.sort(Comparator.comparing(User::getId).thenComparing(User::getAge));
-
- //首先按id对对象进行排序,如果id相同,则按age进行排序
- list.sort(Comparator.comparing(User::getId).reversed().thenComparing(User::getAge).reversed());
Comparable排序Comparable 是类内部的比较方法,需要修改比较类的内部方法,实现如下:
- import lombok.Data;
-
- @Data
- public class User implements Comparable
{ -
- private int id;
- private int age;
- private String name;
-
- public User(int id, int age, String name) {
- this.id = id;
- this.name = name;
- this.age = age;
- }
-
- @Override
- public int compareTo(User user) {
- return user.getAge() - this.getAge();
- }
- }
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
-
- public class SortTest {
-
- public static void main(String[] args) {
- // 初始化数据
- List
list = new ArrayList() {{ - add(new User(1, 43, "北京"));
- add(new User(5, 16, "天津"));
- add(new User(3, 33, "石家庄"));
- add(new User(4, 27, "深圳"));
- }};
-
- // 使用Comparable进行排序
- Collections.sort(list);
- list.forEach(p -> {System.out.println(p);});
-
- }
- }
结果如下图所示:

- import java.util.ArrayList;
- import java.util.Comparator;
- import java.util.List;
- import java.util.stream.Collectors;
-
- public class SortTest {
-
- public static void main(String[] args) {
- // 初始化数据
- List
list = new ArrayList() {{ - add(new User(1, 43, "北京"));
- add(new User(5, 16, "天津"));
- add(new User(3, 33, "石家庄"));
- add(new User(4, 27, "深圳"));
- }};
-
- // 使用Stream排序,默认升序,使用reversed为降序
- list = list.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
-
- list.forEach(p -> System.out.println(p));
-
- }
- }
- // 使用Stream排序的组合排序,使用age降序,再使用id升序
- list = list.stream().sorted(Comparator.comparing(User::getAge).reversed().thenComparing(User::getId)).collect(Collectors.toList());
若类中有null的情况,可用nullsFirst或nullsLast等方法进行处理(将User类中的int类型修改为了Integer,int类型不允许为null,默认为0),代码示例如下
- import lombok.Data;
-
- @Data
- public class User{
-
- private Integer id;
- private Integer age;
- private String name;
-
- public User(Integer id, Integer age, String name) {
- this.id = id;
- this.name = name;
- this.age = age;
- }
- }
- import java.util.ArrayList;
- import java.util.Comparator;
- import java.util.List;
- import java.util.stream.Collectors;
-
- public class SortTest {
-
- public static void main(String[] args) {
- // 初始化数据
- List
list = new ArrayList() {{ - add(new User(1, 43, "北京"));
- add(new User(5, 16, "天津"));
- add(new User(3, 33, "石家庄"));
- add(new User(4, null, "深圳"));
- }};
-
- // 使用Stream排序,默认升序,使用reversed为降序,nullsXXX处理null的情况
- list = list.stream().sorted(Comparator.comparing(User::getAge,
- Comparator.nullsFirst(Integer::compareTo)))
- .collect(Collectors.toList());
- list.forEach(p -> System.out.println(p));
-
- }
- }
结果如下所示: