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

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详解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值