Arrays.sort()对基本类型采用动态分层策略:长度<47用插入排序;47–285用双枢轴快排(五取样选轴、三向切分);≥286或检测到高无序度时切归并排序,确保高效稳定。

Java 的 Arrays.sort() 对基本类型(如 int[]、long[]、double[] 等)并非统一用一种算法,而是根据数组长度和数据特征动态选择最优策略——这种分层优化是它高效稳定的核心原因。
小数组:插入排序直接上场
当数组长度小于 47 时,直接采用插入排序。它简单、无递归开销、缓存友好,对小规模数据实际比快排更快。比如 10 个整数的局部排序,插入排序几轮比较交换就完成,完全没必要启动复杂分区逻辑。
- 阈值固定为 47,由 OpenJDK 源码中的
INSERTION_SORT_THRESHOLD常量定义 - 不依赖随机访问或额外空间,原地操作,内存压力极低
- 对近乎有序的数据表现极佳,哪怕只有少量乱序元素也能快速收敛
中等规模:双轴快速排序主力承担
长度在 47 到 286 之间时,默认启用双轴快速排序(Dual-Pivot Quicksort)。它选两个基准值(pivot1 和 pivot2),一次划分就把数组分成三段,减少递归深度和比较次数。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 五取样法选轴:从数组中均匀取 5 个位置的元素,取中位数确定双轴,避免最坏情况
- 三向切分处理重复值:把等于 pivot1 或 pivot2 的元素集中到中间段,大幅降低重复元素带来的性能衰减
- 比单轴快排平均少约 10% 的比较次数,在真实业务数据中优势明显
大数组或高无序度:归并排序兜底保障
当数组长度 ≥ 286,或递归过程中发现当前子数组“无序程度高”(例如多次分区后仍不平衡),会自动切换为归并排序。这不是退化,而是主动降级以保稳定性与最坏时间复杂度。
立即学习“Java免费学习笔记(深入)”;
- 归并排序保证严格 O(n log n),杜绝快排最坏 O(n²) 风险
- 对已部分有序的数据有自适应优势,TimSort 的思想也源于此逻辑
- 虽然需要额外 O(n) 空间,但对基本类型数组,JVM 会做内存优化,实际开销可控
原地修改 + 无返回值设计
Arrays.sort(int[]) 没有返回值,直接修改原数组。这既是约定也是优化:避免创建新数组的堆分配和拷贝开销,尤其对大数组意义显著。
- 调用后原数组引用不变,内容已重排,适合链式处理场景
- 若需保留原始顺序,必须提前
clone()或用Arrays.copyOf() - 所有重载版本(含范围排序
sort(arr, from, to))均遵循这一原则

















