9

我无法理解 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 方法逻辑在哪里考虑?

4

5 回答 5

18

请注意泛型出现在哪里:

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

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

class Animal {}

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

你仍然可以传递List<Dog>Collections.sort()(注意,Dogimplements Comparable<Animal>,而不是Comparable<Dog>像往常一样)。


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

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

于 2013-01-14T16:40:08.813 回答
8

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

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

于 2013-01-14T16:39:46.537 回答
2

首先这个方法的返回类型是 void

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

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

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

对象[] a = list.toArray();

将列表转换为普通数组。

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

数组排序。

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

从数组中按排序顺序分配给列表元素

于 2013-01-14T16:42:08.063 回答
1
 What is <T extends Comparable<? super T>>

这是指定Tin 的类型List<T>。阅读有关类型推断的本教程。

于 2013-01-14T16:37:47.520 回答
1

首先这个方法的返回类型是void。> 方法签名中的作用是什么?

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

例如,如果你想将 a 传递List<String>给它会编译为java.lang.Stringimplements的 sort 方法java.lang.Comparable,但是如果你传递List<Animal>了你会得到一个编译器错误,除非Animalimplementsjava.lang.comparable

于 2013-01-14T16:38:43.333 回答