Java 如何对集合排序
在日常写代码的场景里,我们总会碰到“把一堆数据按要求排整齐”的需求——比如把学生成绩从高到低排,或者把购物车里的商品按加入时间先后理清楚。如果是用Java做开发,“集合排序”是绕不开的基础操作,而且有两种常用方法,普通新手也能快速上手。
第一种:用工具类直接排序,适合简单场景
Java里有个专门处理集合的工具类叫Collections,它自带的sort()方法就像个“自动整理小助手”,能直接把我们的List集合按默认规则排好。

举个生活化的例子:你有一张记了5个朋友身高的便签(对应List<Integer>),数字就是身高的厘米数。如果直接用Collections.sort(身高列表),它会自动把数字从小到大排——就像你把便签上的数按从左到右越来越大贴在墙上一样。
不过这个方法只能排“天生能比大小”的内容,比如数字、字符串。字符串的排序是按字典序,比如“苹果”会排在“香蕉”前面,因为“苹”的拼音首字母比“香”靠前。但如果要按身高从大到小排,或者排自己定义的对象(比如学生类),这个默认方法就不够用了。
第二种:自定义排序规则,灵活适配需求
如果要排自己写的对象,比如学生类(有姓名、成绩两个属性),或者要改排序方向,就得告诉Java“我要怎么比”。这里有两种常用的写法,都是为了给排序规则“搭个框架”。
第一种是让对象自己说“怎么比”:比如给学生类实现Comparable接口,规定“成绩高的排前面”。这样当你调用Collections.sort(学生列表)时,它就会按照你定的规则来——就像你提前跟朋友说“我们按成绩比高低站队”,朋友就会自动按要求站好。
第二种是临时给排序加个“自定义规则”:如果不想改原来的类,或者要临时换规则(比如这次按成绩排,下次按姓名排),就可以用Comparator接口。比如想让学生按成绩从高到低排,就可以写个临时规则:“拿两个学生的成绩比,把大的放前面”。举个代码里的简单例子:假设studentList是存了5个学生的列表,写Collections.sort(studentList, (s1, s2) -> s2.getScore() - s1.getScore()),这行代码就是在告诉Java,“每次比两个学生的成绩,第二个减第一个,结果是正数就把第二个放前面”,这样就实现了倒序。
新手容易踩的小坑
很多刚学Java的人会搞错“排序的是原集合还是新集合”:用Collections.sort()会直接改原来的集合,不会生成新的,就像你直接在原来的便签上改数字顺序;如果想保留原来的集合,就得先复制一个再排序。另外,排序时要注意数据类型,比如不能把字符串和数字放同一个集合里排序,就像不能把身高和年龄混在一起比大小,不然会出乱子。
总的来说,Java的集合排序核心就是“默认规则”和“自定义规则”两种,简单的情况用工具类直接排,复杂的场景给个明确的比大小规则,就能搞定大部分需求。