猿来绘Java-41-源码分析String对象的数组的排序(JDK1.8)

 

1. 查看下 Arrays的sort方法,源码使用了 merge sort 或者binary insertion sort

public static void sort(Object[] a) {
    if (LegacyMergeSort.userRequested)
        legacyMergeSort(a);
    else
        ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
}

/** To be removed in a future release. */
private static void legacyMergeSort(Object[] a) {
    Object[] aux = a.clone();
    mergeSort(aux, a, 0, a.length, 0);
}

2. 查看其中的一个排序算法,以 merge sort举例, String[] 中的每个元素是 String字符串,元素与元素比较时使用了 compareTo 方法, 也就是调用了String类的compareTo方法,比较之后进行 swap(dest, j, j-1);

 

private static void legacyMergeSort(Object[] a) {
    Object[] aux = a.clone();
    mergeSort(aux, a, 0, a.length, 0);
}

private static void mergeSort(Object[] src,
                              Object[] dest,
                              int low,
                              int high,
                              int off) {
    int length = high - low;

    // Insertion sort on smallest arrays
    if (length < INSERTIONSORT_THRESHOLD) {
        for (int i=low; i<high; i++)
            for (int j=i; j>low &&
                     ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)
                swap(dest, j, j-1);
        return;
    }
    ...

 

3. String 中的 compareTo方法

依次比较两个字符串中的每一个char, 如果不相等 return c1 - c2

public int compareTo(String anotherString) {
    int len1 = value.length;
    int len2 = anotherString.value.length;
    int lim = Math.min(len1, len2);
    char v1[] = value;
    char v2[] = anotherString.value;

    int k = 0;
    while (k < lim) {
        char c1 = v1[k];
        char c2 = v2[k];
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
    }
    return len1 - len2;
}

 

 

 

 

 

Guess you like

Origin blog.csdn.net/asdfjklingok/article/details/118082783