优先推荐使用 Arrays.sort() 而非手写快排,因其底层采用双轴快排等优化策略,性能高、安全可靠;基本类型默认原地升序排序,对象数组需提供比较逻辑,特殊需求外不建议自行实现。

直接用 Arrays.sort() 处理基本类型大数组
对于 int[]、long[]、double[] 等基本类型数组,`Arrays.sort()` 默认采用双轴快排(Dual-Pivot Quicksort),在大数据量下性能优异,平均时间复杂度为 O(n log n),且原地排序、内存开销小。
- 升序:直接调用
Arrays.sort(arr) - 指定范围:如只排索引 1000 到 9999 的段,用
Arrays.sort(arr, 1000, 10000) - 注意:该方法修改原数组,不返回新数组
对对象数组排序需明确比较逻辑
String 数组或自定义对象(如 Person[])必须提供排序依据:
- 若类已实现
Comparable接口(如 String、Integer),直接Arrays.sort(objArr)即可按自然序排 - 按字段排序(如 Person.age):
Arrays.sort(people, Comparator.comparing(p -> p.age)) - 降序:链式调用
.reversed()或用Comparator.reverseOrder()
需要保留原数组时,先复制再排序
避免破坏原始数据:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 基本类型副本:
int[] copy = Arrays.copyOf(original, original.length); Arrays.sort(copy); - 引用类型注意是浅拷贝 —— 对象本身没复制,只是复制了引用;如需深拷贝,得手动克隆或序列化
- 也可用 Stream(适合包装类或字符串):
Integer[] sorted = Arrays.stream(arr).sorted().toArray(Integer[]::new);
极特殊场景才考虑手写快排
除非有强定制需求(如特定 pivot 策略、嵌入式环境限制、教学演示),否则不建议自行实现。手写快排易出错,尤其在边界处理、递归深度、最坏情况(如已排序数组)下可能退化为 O(n²),还可能栈溢出。
立即学习“Java免费学习笔记(深入)”;
- 若真要实现,务必加入“三数取中”选基准 + 小数组切换插入排序(阈值通常设为 10–15)
- 递归改迭代可防栈溢出,但代码复杂度显著上升
- 生产环境应以 `Arrays.sort()` 或 `Collections.sort()` 为准

















