2017-04-02 44 views
0

我一直在瀏覽java.util.Arrays的源代碼,並在排序時總是指數組的長度(對於ArrayList,我假設它指的是E []數據(瞬態)字段的長度 但是實際上不應該指大小字段,因爲它們並不總是相等。java.util.Arrays如何處理ArrayList(長度和大小)?

+1

正如你已經在挖掘該源,爲什麼不發佈一些呢?有不止一個版本的JDK,所以誰知道我們都會查看你偷看的源代碼?! – GhostCat

+3

'Arrays'與排序'ArrayList'無關,你在考慮'Collections'嗎? –

回答

0

Collections找到答案,它調用toArray(),它返回一個長度相等的ArrayList數組Arrays排序的副本和Collections用來排序實際的ArrayList。

1

當排序它總是指的是長度h的陣列

不,它不。對於每種數據類型都有一個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 method,所述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)

+0

已經找到答案,但你的答案更清楚。 –