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