Java记录 -67- 深入剖析Collections的sort方法

本文详细介绍了Java中Collections类的sort方法及其内部实现原理,通过对比带与不带Comparator参数的sort方法,阐述了如何对List中的元素进行排序,并解释了其背后的算法机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Collections类可以将存储与List中的元素进行排序,可以按照针对元素的排序方法进行排序,也可以按照指定的排序类进行排序。


Collections类提供了两个静态的sort方法:

  1. sort(List<T> list)

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

第一个方法是直接将List中的元素进行排序,排序方法需要List中存储的元素来提供,即存储的元素要是可排序的;

第二个方法除了提供要排序的List外,还需要提供一个指定的排序类,来指定排序规则,该List中存储的元素可不实现可排序接口。


从源代码查看它们具体的实现:

public static <T extends Comparable<? super T>> void sort(List<T> list) {    Object[] a = list.toArray();    Arrays.sort(a);    ListIterator<T> i = list.listIterator();    for (int j=0; j<a.length; j++) {        i.next();        i.set((T)a[j]);    }}public static <T> void sort(List<T> list, Comparator<? super T> c) {    Object[] a = list.toArray();    Arrays.sort(a, (Comparator)c);    ListIterator i = list.listIterator();    for (int j=0; j<a.length; j++) {        i.next();        i.set(a[j]);    }}

Collections的两个sort方法分别调用了Arrays的两个对应的sort方法,将排序的实现推给了Arrays去实现,下面我们看看Arrays中是怎么实现的sort方法:

    public static void sort(Object[] a) {        Object[] aux = (Object[])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;        }        // Recursively sort halves of dest into src        int destLow  = low;        int destHigh = high;        low  += off;        high += off;        int mid = (low + high) >>> 1;        mergeSort(dest, src, low, mid, -off);        mergeSort(dest, src, mid, high, -off);        // If list is already sorted, just copy from src to dest.  This is an        // optimization that results in faster sorts for nearly ordered lists.        if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {            System.arraycopy(src, low, dest, destLow, length);            return;        }        // Merge sorted halves (now in src) into dest        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {            if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)                dest[i] = src[p++];            else                dest[i] = src[q++];        }    }

不带比较器参数的Arrays.sort方法调用了不带比较器的mergeSort方法,在mergeSort的实现中调用了存储对象本身的compareTo方法,因此利用该方法进行sort排序的对象必须实现compareTo方法。

        public static <T> void sort(T[] a, Comparator<? super T> c) {        T[] aux = (T[])a.clone();        if (c==null)            mergeSort(aux, a, 0, a.length, 0);        else            mergeSort(aux, a, 0, a.length, 0, c);    }        private static void mergeSort(Object[] src,                  Object[] dest,                  int low, int high, int off,                  Comparator c) {        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 && c.compare(dest[j-1], dest[j])>0; j--)                swap(dest, j, j-1);            return;        }        // Recursively sort halves of dest into src        int destLow  = low;        int destHigh = high;        low  += off;        high += off;        int mid = (low + high) >>> 1;        mergeSort(dest, src, low, mid, -off, c);        mergeSort(dest, src, mid, high, -off, c);        // If list is already sorted, just copy from src to dest.  This is an        // optimization that results in faster sorts for nearly ordered lists.        if (c.compare(src[mid-1], src[mid]) <= 0) {           System.arraycopy(src, low, dest, destLow, length);           return;        }        // Merge sorted halves (now in src) into dest        for(int i = destLow, p = low, q = mid; i < destHigh; i++) {            if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0)                dest[i] = src[p++];            else                dest[i] = src[q++];        }    }

带比较器参数的Arrays.sort方法调用了带比较器的mergeSort方法,在mergeSort的实现中调用了比较器的compareTo方法,而没有调用存储对象本身的。只需指定一个比较器即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值