java.util.Arrays如何处理ArrayList的排序(长度与大小)?

时间:2017-04-02 18:31:36

标签: java arrays arraylist

我一直在查看java.util.Arrays的源代码,并且在排序时总是引用数组的长度(对于我假设的ArrayList,它指的是E []数据的长度(瞬态)场。 但实际上它并不是指大小字段,因为它们并不总是彼此相等。

2 个答案:

答案 0 :(得分:1)

  

排序时总是指数组的长度

不,它没有。对于每种数据类型,都会有Arrays.sort的重载,它接受fromIndextoIndex个参数,指定要排序的数组的确切部分,例如Arrays.sort(Object[] a, int fromIndex, int toIndex, Comparator<? super T> c)

这是ArrayList.sort调用的方法:

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++;
}

ArrayList将自己的size变量直接传递给排序方法。

对于不覆盖its sort methodListdefault implementation首先将内容转储到临时数组并对其进行排序:

  

默认实现获取包含此列表中所有元素的数组,对数组进行排序,并迭代此列表,从数组中的相应位置重置每个元素。 (这样可以避免尝试对链接列表进行排序所导致的n2 log(n)性能。)

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);
    }
}

从Java 8开始,旧方法Collections.sort(list)只调用list.sort(null)

答案 1 :(得分:0)

Collections中找到答案,它调用toArray(),它返回一个ArrayList数组,其长度等于大小,Arrays对副本进行排序,Collections使用那就是对实际的ArrayList进行排序。