簡體   English   中英

java arraylist ensureCapacity無法正常工作

[英]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個空條目會導致濫用數據結構。

  1. 考慮使用標准原始數組。

  2. 如果您需要泛型或想要更有效地使用空間,那么考慮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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM