全面解析Arrays.sort——JDK源码解析

一. 简介

Arrays.sort()方法,是我们常用排序方法,所在包  java.util.Arrays; 该方法提供了对所有类型的排序方法,不同类型采用的排序策略也不尽相同。今天我们一起来讨论下关于Arrays.sort()对不同类型排序的支持和策略,和对不同类型的排序又做了哪些优化。
如下是JDK1.8的Arrays.sort()方法:
全面解析Arrays.sort——JDK源码解析_第1张图片




二. 源码解析


1.对Primitive的支持

在对原生类型的排序支持上,JDK使用的是一种叫做 双轴快速排序的排序方法: DualPivotQuicksort.sort信很多人和我一样,是第一 次看到这个名词,我们结合Arrays.sort对int数组的排序好好了解下这个排序:
DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);

* Sorts the specified array into ascending numerical order.

我们从这个注解可以看出,排序是默认按照升序排列的。
This algorithm
* offers O(n log(n)) performance on many data sets that cause other
* quicksorts to degrade to quadratic performance, and is typically
* faster than traditional (one-pivot) Quicksort implementations.
同样,从该注释中我们看出,该算法同样提供 O(nlog(n))复杂度,但是比普通的单轴快排性能更优。

点进去,可以看到,当传参数组小于一个Constant值的时候,会进行双轴快速排序 sort()
// Use Quicksort on small arrays
if (right - left < QUICKSORT_THRESHOLD) {
    sort(a, left, right, true);
    return;
}
这个值为
private static final int QUICKSORT_THRESHOLD = 286;
使用sort()方法,点进去看,我们发现同样当需要排序的范围小于一个阈值时,会采用插入排序
if (length < INSERTION_SORT_THRESHOLD) {
这个阈值为:
private static final int INSERTION_SORT_THRESHOLD = 47;
我们知道插入排序不用去遍历整个数组,整个排序算法的核心性能消耗即是移位,当数组过大之后,会导致进行大量的移位操作,但是当数组较小的时候,插入排序的效果反倒会更好。
使用插入排序有值得提的地方即使,在调用sort()方法的时候,传入了一个布尔值leftmost,



你可能感兴趣的:(JDK源码)