Arrays.sort()对对象数组排序的关键在于比较逻辑的构建:要么让对象实现Comparable接口定义自然顺序,要么临时传入Comparator指定规则;前者适用于稳定主序(如按价格),后者适合多条件或临时排序,且需注意null安全、基本类型与包装类型差异及性能优化。

Arrays.sort() 对对象数组排序,关键不在调用本身,而在于比较逻辑的构建方式:是让对象自己定义“谁大谁小”,还是临时指定规则。选对路径,代码清晰、性能可靠、维护成本低。
对象排序必须有比较依据
String[]、Integer[] 这类已实现 Comparable 的数组,直接 Arrays.sort() 就能按自然顺序排好。但自定义类(比如 Book、User)默认不支持排序——运行时会抛 ClassCastException。
解决办法只有两个:
- 让类实现 Comparable 接口,在 compareTo() 中定义唯一主序(如按 price 升序)
- 不改类,调用时传入 Comparator(Lambda 或实现类),灵活应对不同场景
Comparable 适合稳定主排序逻辑
当某个字段天然代表该对象的“主要顺序”(如学生成绩按总分、商品按价格),就该在类里实现 Comparable。
立即学习“Java免费学习笔记(深入)”;
注意三点:
- 重写 compareTo() 时优先用 Integer.compare(a, b) 而非 a - b,避免整数溢出
- 多字段组合可用链式判断:return age != o.age ? Integer.compare(age, o.age) : name.compareTo(o.name)
- 字段可能为 null?先判空,或用 Objects.compare(this.field, o.field, Comparator.nullsLast(String::compareTo))
Comparator 更适合临时、多条件或外部控制
同一类要按不同字段排序(比如先按创建时间、再按标题长度),或仅本次需要特殊规则,就用 Comparator。
推荐写法:
- Lambda 简洁表达:Arrays.sort(books, (a, b) -> Double.compare(a.getPrice(), b.getPrice()))
- 链式构造更可读:Arrays.sort(users, Comparator.comparing(User::getAge).thenComparing(User::getName).reversed())
- null 安全写法:Arrays.sort(items, Comparator.comparing(Item::getTag, Comparator.nullsLast(String::compareTo)))
别踩这些常见坑
基本类型数组(int[])和包装类型数组(Integer[])走的是完全不同的重载方法,不能混用;前者不接受 Comparator,后者可以。
另外要注意:
- Arrays.sort() 永远修改原数组,不是返回新数组
- 默认不处理 null,对象数组含 null 时必须用 nullsFirst()/nullsLast() 包裹比较器
- 需要稳定排序(相等元素保持原序)?对象数组可用 Collections.sort(Arrays.asList(arr), comp),基本类型则不行
- 只取 Top N?全量排序浪费资源,改用 PriorityQueue 更高效


















