2010-06-22 60 views
0

正如我們所知,當添加元素(Vector的100%)時,ArrayList將其大小增加50%。我們在哪裏可以找到此行爲的實現?java Arralist大小?

THX

回答

4

ArrayList

public void ensureCapacity(int minCapacity) { 
    modCount++; 
    int oldCapacity = elementData.length; 
    if (minCapacity > oldCapacity) { 
    Object oldData[] = elementData; 
    int newCapacity = (oldCapacity * 3)/2 + 1; 
    if (newCapacity < minCapacity) 
     newCapacity = minCapacity; 
    // minCapacity is usually close to size, so this is a win: 
    elementData = Arrays.copyOf(elementData, newCapacity); 
    } 
} 

Vector

private void ensureCapacityHelper(int minCapacity) { 
    int oldCapacity = elementData.length; 
    if (minCapacity > oldCapacity) { 
    Object[] oldData = elementData; 
    int newCapacity = (capacityIncrement > 0) ? 
     (oldCapacity + capacityIncrement) : (oldCapacity * 2); 
    if (newCapacity < minCapacity) { 
     newCapacity = minCapacity; 
    } 
    elementData = Arrays.copyOf(elementData, newCapacity); 
    } 
} 

注:capacityIncrement默認爲0,除非設置otherwi因此Vector的默認行爲是在每次需要擴展後備陣列時加倍,但如果您設置了capacityIncrement,則它將由此增加。

同樣在所有情況下(對於ArrayListVector),如果新容量仍然不夠大,在這種情況下使用所需容量,則增加 - 無論它是什麼 - 會被取代。

+0

證明,不能與代碼爭論... – jjnguy 2010-06-22 06:12:52

+1

請注意,這已完全改寫爲JDK 7: http://cr.openjdk.java.net/~martin/webrevs/openjdk7/ArrayResize/ – 2010-06-22 17:13:40

4

在哪裏可以發現這種行爲的實施?

在源代碼中。您可以在Sun JDK安裝的「src.zip」文件中找到Sun Java類庫的源代碼。 OpenJDK 6和OpenJDK 7的源代碼也可以通過OpenJDK Project page下載。對於其他Java實現,請查看Web或查閱文檔。

要當心 - 並非所有的Java類庫都以相同的方式實現這些類。例如,查看Apache Harmony項目源代碼或GNU Classpath項目源代碼不會告訴您Sun JDK類庫如何工作。

0

..在執行ArrayList#add

下面是一個實現:

public boolean add(E object) { 
    if (lastIndex == array.length) { 
    growAtEnd(1); 
    } 
    array[lastIndex++] = object; 
    modCount++; 
    return true; 
} 

它調用growAtEnd這種方法中,我們發現了片段:

} else { 
    int increment = size/2; 
    if (required > increment) { 
    increment = required; 
    } 
    if (increment < 12) { 
    increment = 12; 
    } 
    E[] newArray = newElementArray(size + increment); 
    if (size > 0) { 
    System.arraycopy(array, firstIndex, newArray, 0, size); 
    firstIndex = 0; 
    lastIndex = size; 
    } 
    array = newArray; 

..其中增量被設定爲的實際尺寸的50%當前列表。


docjar包含Apache harmony project的源代碼,Apaches開源的Java SE 6平臺。有很多不同的Java實現,並且不保證每個實現都顯示完全相同的行爲(例如,以50%的步幅增加大小),只要它在此方法的接口中沒有記錄/要求即可。

+0

這個實現是不同的:http://developer.classpath.org/doc/java/util/ArrayList-source.html – 2010-06-22 05:56:51

+0

不是這樣的Andreas ..初始ArrayList會有一些默認的容量(對於向量它是10) 。如果沒有空間容納一個新的元素,那麼它會增加50%。 – JavaUser 2010-06-22 05:58:47

+0

@ RC.那麼結論是什麼? – JavaUser 2010-06-22 06:00:19