arrays.sort() 对对象数组排序的关键在于提供清晰稳定的比较逻辑:实现 comparable 接口适用于天然主序,comparator 则支持灵活多字段临时排序,注意 null 处理、性能优化及线程安全。

直接用 Arrays.sort() 对对象数组排序,关键不是调用方法本身,而是提供清晰、稳定的比较逻辑——要么让类实现 Comparable,要么传入 Comparator。选对方式,性能不输手写快排,还更安全可靠。
让对象自己知道怎么比:实现 Comparable 接口
适合对象有天然、唯一的主要排序依据(比如学生成绩按总分、商品按价格)。实现后,Arrays.sort(arr) 就能直接用,无需额外参数。
- 在类中重写
compareTo(),返回负数、0、正数分别表示“小于”“等于”“大于” - 注意避免空指针:比较字段前先判空,或用
Objects.compare(a, b, Comparator.nullsLast()) - 多个字段组合排序?用链式比较:
Integer.compare(this.age, o.age) != 0 ? ... : Double.compare(this.score, o.score)
临时灵活排序:用 Comparator 匿名类或 Lambda 表达式
当同一类需按不同字段多次排序(如先按姓名升序,再按创建时间降序),不必改源码,直接传 Comparator 即可。
- Lambda 最简写法:
Arrays.sort(books, (a, b) -> a.getPrice() - b.getPrice())(仅适用于 int/long 差值不溢出) - 推荐用
Comparator.comparing()链式调用:Arrays.sort(users, Comparator.comparing(User::getAge).thenComparing(User::getName)) - 降序?加
.reversed()或用Comparator.comparing(...).reversed()
注意 null 和性能边界
Arrays.sort() 底层是双轴快排(Java 7+),平均 O(n log n),但实际效率受比较器开销影响很大。
- 避免在
compare()中反复调用耗时方法(如数据库查询、字符串解析),提前缓存结果 - 含 null 元素?默认抛
NullPointerException,用Comparator.nullsFirst()或nullsLast()包裹 - 原始类型数组(如
int[])用专用重载方法,别误传对象数组,否则编译不过
替代方案:Collections.sort() 与 Stream.sorted()
如果数据已在 List 中,Collections.sort(list, comp) 更自然;若需链式处理(过滤+排序+截取),list.stream().sorted(comp).limit(10).collect(...) 更流畅。
-
Arrays.sort()修改原数组;Stream.sorted()返回新流,不改变原数据 - 大数据量且只取前 N 名?考虑堆排序(
PriorityQueue),比全量排序更快 - 并发环境下排序?确保比较器无状态、线程安全,别在其中修改共享变量











