我一直在查看java.util.Arrays的源代码,并且在排序时总是引用数组的长度(对于我假设的ArrayList,它指的是E []数据的长度(瞬态)场。 但实际上它并不是指大小字段,因为它们并不总是彼此相等。
答案 0 :(得分:1)
排序时总是指数组的长度
不,它没有。对于每种数据类型,都会有Arrays.sort
的重载,它接受fromIndex
和toIndex
个参数,指定要排序的数组的确切部分,例如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
method的List
,default 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进行排序。