Collections.sort实现

时间:2013-01-14 16:35:22

标签: java sorting collections

我无法理解Collections.sort方法的方法实现和逻辑。这是我找到的方法实现,

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]);
    }
    }

首先,此方法的返回类型为void。 <T extends Comparable<? super T>>在方法签名中的作用是什么?

在这里使用Array.sort的目的是什么?

一旦我们实现了可比较或比较器,我们编写的compare或compareTo方法逻辑在哪里考虑?

5 个答案:

答案 0 :(得分:16)

请注意泛型类型的出现位置:

public static <T extends Comparable<? super T>> void sort(List<T> list)

它基本上声明并限制泛型类型T。在这种特殊情况下,它意味着: T必须扩展Comparable<F> ,其中 F必须是T类型或其超类型。这意味着如果你有以下类:

class Animal {}

class Dog extends Animal implements Comparable<Animal> {
    //...
}

您仍然可以将List<Dog>传递给Collections.sort()(请注意Dog实施Comparable<Animal>,而不是照常Comparable<Dog>


使用

Arrays.sort(),因为这是实现排序算法的地方。如果集合不是随机访问,则需要遵守合同并避免次优运行时从集合到数组的防御性副本。

某些列表(如LinkedList)的随机访问(按索引)性能较差,这使得大多数排序算法都很慢(在O(n^2)范围内)。最好是防御性地复制整个集合并对数组进行排序,因为O(n + nlogn + n)仍然是O(nlogn) - 如果你得到大O符号的话。)

答案 1 :(得分:5)

Collections.sort的工作方式是它实际上采用集合的底层数组,并调用它的排序方法来对实际元素进行排序。 Java使用的排序算法是闪电般快速Timsort

该方法返回void,因为它对集合就地进行排序。也就是说,修改您通过对其元素进行排序而将其作为参数提供的集合。返回已排序的副本将浪费资源。

答案 2 :(得分:2)

  

首先,此方法返回类型为void

因为它是就地实施。传递给方法的列表将被排序

  

方法签名中<T extends Comparable<? super T>>的作用是什么?

比较扩展Comparable类型T及其子类的{{1}}接口的结果。

  

Object [] a = list.toArray();

将列表转换为普通数组。

  

在这里使用Array.sort的目的是什么?

对数组进行排序。

  

i.set((T)A [j]);

从数组

按排序顺序分配列表元素

答案 3 :(得分:1)

 What is <T extends Comparable<? super T>>

这是在T中指定List<T>的类型。请阅读Type Inference上的本教程。

答案 4 :(得分:1)

  

首先,此方法的返回类型为void。什么是&gt;在方法签名中做什么?

是您在方法中使用的泛型类型,T只能是实现java.util.Comparable的对象。

例如,如果您想将List<String>传递给它编译为java.lang.String实现java.lang.Comparable的排序方法,但如果您通过List<Animal>,则会获得Animal除非java.lang.comparable实现{{1}}

,否则编译错误