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

标签 java arrays arraylist

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

最佳答案

when sorting it always refers to the length of the array

不,没有。对于每种数据类型,都有 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变量直接传递给排序方法。

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

The default implementation obtains an array containing all elements in this list, sorts the array, and iterates over this list resetting each element from the corresponding position in the array. (This avoids the n2 log(n) performance that would result from attempting to sort a linked list in place.)

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) .

关于java - java.util.Arrays 如何处理 ArrayList 的排序(长度与大小)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43172027/

相关文章:

java - Avro 模式不支持向后兼容性

java - 为什么要使用通配符捕获辅助方法?

javascript - Javascript数组的排序

java - 如何使我的排序列表更加高效?

java - 在 Android 中使用自然排序顺序对 ArrayList 进行排序?

c - C 中最简单的 Arraylist 实现

java - 从 LambdaMetafactory 创建 BiConsumer

java - BouncycaSTLe:如何创建 RSA 私钥的加密 PKCS8 表示?

javascript - 使用相同的代码迭代并访问数组和对象元素

java - Java中不可修改的列表