欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中排序源码分析(JDK1.8)

程序员文章站 2022-03-22 09:09:26
...

List排序

在开发过程中常用的是jdk自带的排序

Collections.sort(List<T> list, Comparator<? super T> c);

打开源码如下:

@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> void sort(List<T> list, Comparator<? super T> c) {
   list.sort(c);
}

也就说可以直接调用list.sort©进行排序,那么list的sort方法是如何实现排序的,继续看源码ArrayList 的sort实现

  @Override
    @SuppressWarnings("unchecked")
    public void sort(Comparator<? super E> c) {
        final int expectedModCount = modCount;
        Arrays.sort((E[]) elementData, 0, size, c);
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
        modCount++;
    }

ArrayList的底层是数组,通过 Arrays.sort()对数组进行排序

数组排序

Arrays.sort(T[] a, Comparator<? super T> c);
    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }

当Comparator == null时,调用sort(a, fromIndex, toIndex);如下

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

在jdk1.8中LegacyMergeSort.userRequested是false,可以通过System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
强制使用legacyMergeSort排序,目的是为了兼容低版本

TimSort是结合了合并排序(合并排序)和插入排序(插入排序)而得出的排序算法,它在现实中有很好的效率

由此可知:ArrayList和数组是用过 ComparableTimSort.sort()和 TimSort.sort()实现排序的。

参考博客:
MergeSort与TimSort,ComparableTimSort
Timsort详解
ComparableTimSort详解

相关标签: 排序