0
A
回答
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
,則它將由此增加。
同樣在所有情況下(對於ArrayList
和Vector
),如果新容量仍然不夠大,在這種情況下使用所需容量,則增加 - 無論它是什麼 - 會被取代。
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%的步幅增加大小),只要它在此方法的接口中沒有記錄/要求即可。
相關問題
- 1. 迭代通過arralist - java的
- 2. 顯示gridview中ArraList的值並更改文本大小
- 3. Java ImageIcon大小
- 4. Java庫大小
- 5. Java InputStream大小
- 6. Java最大文件大小
- 7. 的Java堆大小
- 8. Netbeans堆大小java
- 9. 大小不明JAVA
- 10. Java堆/池大小
- 11. Java數組大小
- 12. 矩陣大小Java
- 13. Java Swing JPanel大小
- 14. Java矢量大小()
- 15. Java Swing Table大小
- 16. 按鈕大小(Java)
- 17. 將元素添加到arralist反覆的Java
- 18. Java的.class文件大小Vs的java文件大小
- 19. 如何在kotlin中全局定義arralist
- 20. 在Java中調整圖像大小以縮小圖像大小
- 21. Arraylist ArrayList的Java大小
- 22. Java swing - 填充大小
- 23. Java itext換行大小
- 24. elasticsearch java批量大小
- 25. 固定大小堆棧Java
- 26. Java Swing調整大小BorderLayout.CENTER
- 27. java GridLayout組件的大小
- 28. Java .jar文件大小
- 29. Java JFrame調整大小
- 30. Java增加堆大小
證明,不能與代碼爭論... – jjnguy 2010-06-22 06:12:52
請注意,這已完全改寫爲JDK 7: http://cr.openjdk.java.net/~martin/webrevs/openjdk7/ArrayResize/ – 2010-06-22 17:13:40