为什么Collections.sort()不针对ArrayList优化,但针对LinkedList优化?

时间:2019-01-13 10:41:01

标签: java algorithm sorting timsort

为什么Collections.sort()创建一个额外的对象数组并对该数组执行Tim排序,然后最终将排序后的数组复制回List对象中?我知道此通话已针对LinkedList进行了优化,但是我们会不会因为ArrayList而失去性能?

在将其转换为对象数组并将其添加回列表中时,本可以避免2n个操作。我知道这些额外的操作不会影响整个排序操作的Big-O,但我相信可以针对ArrayList对其进行进一步优化。

我在这里错过了什么吗?我只是想了解为什么要这样布局体系结构。谢谢。

https://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/Collections.java#l164

1 个答案:

答案 0 :(得分:10)

您正在寻找一个较旧的JDK版本。至少从JDK 1.8.0_162起,Collections.sort()调用List的{​​{1}}。尽管默认实现从sort(Comparator<? super E> c)创建一个数组并对该数组进行排序,但是List会覆盖该默认实现,并直接对后备数组进行排序。

ArrayList的{​​{1}}:

Collections

sort的{​​{1}}:

public static <T extends Comparable<? super T>> void sort(List<T> list) {
    list.sort(null);
}

List的{​​{1}}:

sort

换句话说,此问题已在比您正在查看的JDK版本新的JDK版本中得到解决。

您可以查看来源here(由于eckes的链接)。