导读:本期聚焦于小伙伴创作的《在Java中如何使用Collections.sort对集合排序?排序方法与自定义比较解析》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《在Java中如何使用Collections.sort对集合排序?排序方法与自定义比较解析》有用,将其分享出去将是对创作者最好的鼓励。

在Java中,Collections.sort是java.util.Collections类提供的静态排序方法,能够对List接口的实现类集合进行原地排序,默认按照元素的自然顺序升序排列,也支持通过自定义比较规则实现任意维度的排序需求。

在Java中如何使用Collections.sort对集合排序?排序方法与自定义比较解析

一、Collections.sort的基本用法

Collections.sort最直接的使用方式是不传递额外比较参数,此时要求集合中的元素必须实现Comparable接口,重写compareTo方法定义自然排序规则。

1.1 基本数据类型集合排序

Java中的包装类如Integer、String等都已经实现了Comparable接口,因此可以直接对这类元素的集合排序:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SortDemo {
    public static void main(String[] args) {
        // 创建整数集合
        List<Integer> numList = new ArrayList<>();
        numList.add(3);
        numList.add(1);
        numList.add(4);
        numList.add(2);
        
        System.out.println("排序前:" + numList);
        // 默认升序排序
        Collections.sort(numList);
        System.out.println("排序后:" + numList);
        
        // 字符串集合排序,按字典顺序升序
        List<String> strList = new ArrayList<>();
        strList.add("banana");
        strList.add("apple");
        strList.add("cherry");
        Collections.sort(strList);
        System.out.println("字符串排序后:" + strList);
    }
}

上述代码执行后,整数集合会输出[1,2,3,4],字符串集合会输出[apple, banana, cherry]。

1.2 自定义类集合的自然排序

如果要对自定义类的集合使用默认排序,需要让自定义类实现Comparable接口,指定排序规则:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

// 自定义学生类,实现Comparable接口,按年龄升序排序
class Student implements Comparable<Student> {
    private String name;
    private int age;
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    // 重写compareTo方法,定义排序规则
    @Override
    public int compareTo(Student o) {
        // 当前对象年龄小于对比对象年龄,返回负数,排前面
        // 相等返回0,大于返回正数,排后面
        return this.age - o.age;
    }
    
    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + "}";
    }
}

public class CustomSortDemo {
    public static void main(String[] args) {
        List<Student> studentList = new ArrayList<>();
        studentList.add(new Student("张三", 20));
        studentList.add(new Student("李四", 18));
        studentList.add(new Student("王五", 22));
        
        System.out.println("排序前:" + studentList);
        Collections.sort(studentList);
        System.out.println("按年龄升序排序后:" + studentList);
    }
}

二、使用自定义比较器实现灵活排序

当默认的排序规则不满足需求,或者不想修改自定义类的Comparable实现时,可以使用Comparator接口自定义比较规则,将其作为参数传递给Collections.sort方法。

2.1 基于Comparator的临时排序规则

以下示例演示如何对学生集合按姓名降序排序,不需要修改Student类的代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class Student {
    private String name;
    private int age;
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
    
    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + "}";
    }
}

public class ComparatorSortDemo {
    public static void main(String[] args) {
        List<Student> studentList = new ArrayList<>();
        studentList.add(new Student("张三", 20));
        studentList.add(new Student("李四", 18));
        studentList.add(new Student("王五", 22));
        
        // 使用匿名内部类实现Comparator,按姓名降序排序
        Collections.sort(studentList, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // 字符串降序,反转比较结果
                return o2.getName().compareTo(o1.getName());
            }
        });
        System.out.println("按姓名降序排序后:" + studentList);
        
        // Java 8之后可以使用lambda表达式简化写法,按年龄降序排序
        Collections.sort(studentList, (s1, s2) -> s2.getAge() - s1.getAge());
        System.out.println("按年龄降序排序后:" + studentList);
    }
}

2.2 多条件排序场景

实际业务中经常需要多条件排序,比如先按年龄升序,年龄相同再按姓名升序,也可以通过Comparator实现:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class Student {
    private String name;
    private int age;
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
    
    @Override
    public String toString() {
        return "Student{name='" + name + "', age=" + age + "}";
    }
}

public class MultiConditionSort {
    public static void main(String[] args) {
        List<Student> studentList = new ArrayList<>();
        studentList.add(new Student("张三", 20));
        studentList.add(new Student("李四", 18));
        studentList.add(new Student("王五", 20));
        studentList.add(new Student("赵六", 18));
        
        // 先按年龄升序,年龄相同按姓名升序
        Collections.sort(studentList, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // 先比较年龄
                int ageCompare = o1.getAge() - o2.getAge();
                if (ageCompare != 0) {
                    return ageCompare;
                }
                // 年龄相同再比较姓名
                return o1.getName().compareTo(o2.getName());
            }
        });
        System.out.println("多条件排序后:" + studentList);
    }
}

三、Comparable与Comparator的区别

很多开发者会混淆这两个接口,二者的核心区别如下:

对比维度ComparableComparator
包位置java.langjava.util
排序规则归属定义在元素类内部,属于元素的自然排序规则定义在元素类外部,属于临时或扩展的排序规则
方法定义重写compareTo(T o)方法重写compare(T o1, T o2)方法
使用场景类有固定、默认的排序规则时使用需要灵活切换排序规则,或不希望修改元素类代码时使用

四、注意事项

  • Collections.sort只能对List集合排序,Set、Map等集合不支持,若需要对这类集合排序,需要先转换为List。
  • 排序的集合不能为null,且集合中的元素也不能为null,否则会抛出NullPointerException。
  • Collections.sort的排序是原地排序,会直接修改原集合的顺序,若需要保留原集合,需要先复制一份再排序。
  • 自定义比较规则时,要保证比较逻辑的一致性,避免出现compare(a,b)=0但a.equals(b)为false的情况,否则可能导致排序结果不符合预期。
提示:Java 8之后List接口新增了sort方法,功能和Collections.sort一致,也可以直接使用list.sort(comparator)的方式排序,本质都是调用了Arrays.sort的适配实现。

Collections.sortJava集合排序ComparatorComparable自定义比较器修改时间:2026-06-20 13:03:45

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。