jdk 6及之前,对象数组用legacymergesort(改进归并),小数组(

Arrays.sort 的底层策略不是一成不变的,而是随 JDK 版本持续演进,核心目标是兼顾通用性、稳定性与真实场景下的性能。不同版本对基本类型和对象数组采用了差异化的算法组合,并引入了多项阈值驱动的自适应优化。
JDK 6 及之前:统一归并 + 传统快排
对象数组使用 legacyMergeSort(改进版归并排序),小数组(长度
JDK 7:双轴快排与 TimSort 同步落地
这是关键转折点:
- 基本类型数组切换为 DualPivotQuicksort(双轴快排),通过选两个 pivot 将数组三路划分,显著降低比较次数和递归深度
- 对象数组弃用 legacyMergeSort,全面启用 TimSort —— 一种稳定、自适应的混合排序,能识别天然有序段(run),小数组(
- 两者均引入多级阈值判断:例如双轴快排在长度
JDK 8:策略细化与兜底强化
在 JDK 7 基础上进一步打磨边界行为:
- 双轴快排增加 五取样法选轴,提升 pivot 代表性;引入 三向切分高效处理重复元素;递归过深时自动降级为归并排序,避免栈溢出与最坏性能
- TimSort 引入 Galloping Mode(跃进模式)加速归并过程,在一个 run 显著领先时跳过线性比较,改用指数搜索+二分定位
- 新增长度阈值 QUICKSORT_THRESHOLD = 286:超过该长度且未检测到足够自然有序段时,优先尝试归并而非快排,增强鲁棒性
JDK 17 及以后:持续微调与稳定性保障
算法主体未变,但细节更严谨:
- 插入排序阈值仍为 47,但针对 server VM 做了循环展开与边界优化
- TimSort 的 run 检测逻辑更严格,支持升序、严格降序(反转后作为升序 run)及全等片段识别
- 所有对象排序强制要求 稳定性,因此彻底排除快排类不稳定算法;基本类型排序虽不要求稳定,但双轴快排通过分区设计已实际保持相对顺序











