[英]java arraylist ensureCapacity not working
要么我做錯了,要么我不理解這種方法是如何工作的。
ArrayList<String> a = new ArrayList<String>();
a.ensureCapacity(200);
a.add(190,"test");
System.out.println(a.get(190).toString());
我原以為ensureCapacity會讓我插入一個索引達到該值的記錄。 有沒有不同的方法來做到這一點?
我在第三行得到一個IndexOutOfBounds錯誤。
不, ensureCapacity
不會更改ArrayList
的邏輯大小 - 它會更改容量 ,即列表在下次需要復制值之前可以達到的大小。
您需要非常了解邏輯大小(即范圍[0, size)
中的所有值都可訪問,並且添加新元素將以索引size
添加它)和更多實現的容量之間的差異細節真的 - 它是用於存儲的后備陣列的大小。
調用ensureCapacity
應該只在性能方面做出任何改變(通過避免過度復制) - 如果你看到我的意思,它不會影響列表中的內容的邏輯模型。
編輯:聽起來你想要一種ensureSize()
方法,它可能看起來像這樣:
public static void ensureSize(ArrayList<?> list, int size) {
// Prevent excessive copying while we're adding
list.ensureCapacity(size);
while (list.size() < size) {
list.add(null);
}
}
因此,正如其他人提到的那樣, ensureCapacity
並非如此。 看起來你想從一個200個空的ArrayList
開始? 那么這將是最簡單的方法:
ArrayList<String> a = new ArrayList<String>(Arrays.asList( new String[200] ));
然后,如果你想用“test” 替換元素190,請執行以下操作:
a.set(190, "test");
這不同於
a.add(190, "test");
這將在索引190中添加“test”並將其他9個元素向上移動,從而得到大小為201的列表。
如果你知道你總是會有200個元素,那么使用數組可能會更好。
確保容量不會將項目添加到列表中。 如果已經添加了191個元素,則只能獲取元素190或添加元素190。 “容量”只是ArrayList在需要調整其內部數據結構(數組)大小之前可以容納的對象數。 如果ArrayList有一個getCapacity(),那么這樣做:
ArrayList<String> a = new ArrayList<String>();
a.ensureCapacity(200);
System.out.println(a.size());
System.out.println(a.getCapacity());
將分別打印出0和大於或等於200的某個數字
ArrayList保持其容量(內部數組的大小)與其大小(添加的元素數)分開,“set”方法取決於已經分配給元素的索引。 沒有辦法設置大小。 如果需要,可以添加帶循環的虛擬元素:
for (int i = 200; --i >= 0;) a.add(null);
向ArrayList添加190個空條目會導致濫用數據結構。
考慮使用標准原始數組。
如果您需要泛型或想要更有效地使用空間,那么考慮SparseArray
甚至像HashMap
這樣的Map
可能適合您的目的。
public static void fillArrayList(ArrayList<String> arrayList, long size) {
for (int i = 0; i < size + 1; i++) {
arrayList.add(i,"-1");
}
}
public static void main(String[] args) throws Exception {
ArrayList<String> a = new ArrayList<String>(10);
fillArrayList(a, 190);
a.add(190,"test");
System.out.println(a.get(190).toString());
}
JavaDoc再一次澄清了這種情況:
Throws: IndexOutOfBoundsException
- if index is out of range (index < 0 || index > size()).
請注意, size()
返回List當前持有的元素數。
ensureCapacity
只是確保底層數組的容量大於或等於參數。 它不會更改ArrayList
的大小。 它不會通過API顯示任何更改,因此除了在ArrayList
調整其內部數組大小之前可能會更長時間之外,您不會注意到差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.