代码之家  ›  专栏  ›  技术社区  ›  Vineeth Chitteti

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

  •  8
  • Vineeth Chitteti  · 技术社区  · 7 年前

    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 回复  |  直到 6 年前
        1
  •  11
  •   Eran    7 年前

    您看到的是一个较旧的JDK版本。至少从JDK 1.8.0_162开始 Collections.sort() 电话 List sort(Comparator<? super E> c) . 当默认实现从 列表 并对数组进行排序, ArrayList 重写该默认实现,并直接对备份数组进行排序。

    Collections sort

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

    列表 分类

    default void sort(Comparator<? super E> c) {
        Object[] a = this.toArray();
        Arrays.sort(a, (Comparator) c);
        ListIterator<E> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }
    

    分类 :

    public void sort(Comparator<? super E> c) {
        final int expectedModCount = modCount;
        Arrays.sort((E[]) elementData, 0, size, c);
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
        modCount++;
    }
    

    here (感谢埃克斯的链接)。