为什么Collections.sort()
创建一个额外的对象数组并对该数组执行Tim排序,然后最终将排序后的数组复制回List
对象中?我知道此通话已针对LinkedList
进行了优化,但是我们会不会因为ArrayList
而失去性能?
在将其转换为对象数组并将其添加回列表中时,本可以避免2n
个操作。我知道这些额外的操作不会影响整个排序操作的Big-O,但我相信可以针对ArrayList
对其进行进一步优化。
我在这里错过了什么吗?我只是想了解为什么要这样布局体系结构。谢谢。
答案 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的链接)。