Java专题:Collections.sort()

1. 功能

实现对Collection内部对象排序,可对任意一组相似对象进行排序

2. 形式

Collections.sort(List<T> list)
Collections.sort(List<T> list, Comparator<? extends T> c)
  • Collections.sort(List list)

此方法适用于泛型T的实际类型实现了Comparable接口,重写了compare()方法。其底层实现如下:

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
}
default void sort(Comparator<? super E> c) {
    Object[] a = this.toArray();
    Arrays.sort(a, (Comparator) c);   // 转化为了数组排序, 此时c=null;
    ListIterator<E> i = this.listIterator();
    for (Object e : a) { 
        i.next(); 
        i.set((E) e);
    }
}
// 继续找
public static <T> void sort(T[] a, Comparator<? super T> c) {
    if (c == null) {
        sort(a);  // Arrays类重载了sort()
    }
}
public static void sort(Object[] a) {
if (LegacyMergeSort.userRequested)
     legacyMergeSort(a);     // 使用归并排序
else
     ComparableTimSort.sort(a, 0, a.length, null, 0, 0); // 使用二分查找排序
}

在两个排序中都有,如下写法

Comparable pivot = (Comparable) a[start];

都使用了类型强制转换,也就是说 a 必须实现了Comparable接口,所以在未实现该接口而使用Collections.sort(),会报ClassCastException.

  • Collections.sort(List list, Comparator<? extends T> c)

此方法适合泛型类中未实现Comparable()接口,但是必须以实现Comparator接口的类作为参数,使用方法如下:

    Collections.sort(list,new Comparator<Student>(){  // 假设类型为Student,属性有id;按照id升序。
    	@Override
        public int compare(Student st1, Student st2) {
            return st1.id > st2.id? 1 : st1.id == st2.id ? 0 : -1;  // 根据返回的1、0、-1排序
        }
    });

总结

  • 使用 Collections.sort(List< T > list) 时,泛型类必须实现 Comparable 接口,重写 compareTo() 方法
  • 使用 Collections.sort(List< T > list, Comparator<? extends T> c) 时,必须以 Comparator实现类为参数,实现类实现的方法为compare()
上一篇:使用可变方法参考的Java 8 Lambda排序


下一篇:java – 按可空字段排序,说明项目的位置