如何更改陣列的大小

簡單的答案是你不能這樣做。建立陣列後,無法更改其大小。相反,只能通過建立具有適當大小的新陣列並將現有陣列中的元素複製到新陣列來調整陣列。

String[] listOfCities = new String[3];   // array created with size 3.
listOfCities[0] = "New York";
listOfCities[1] = "London";
listOfCities[2] = "Berlin";

假設(例如)需要將新元素新增到如上定義的 listOfCities 陣列中。為此,你需要:

  1. 建立一個大小為 4 的新陣列,
  2. 將舊陣列的現有 3 個元素複製到偏移 0,1 和 2 的新陣列中
  3. 將新元素新增到偏移量為 3 的新陣列中。

有各種方法可以做到這一點。在 Java 6 之前,最簡潔的方法是:

String[] newArray = new String[listOfCities.length + 1];
System.arraycopy(listOfCities, 0, newArray, 0, listOfCities.length);
newArray[listOfCities.length] = "Sydney";

從 Java 6 開始,Arrays.copyOfArrays.copyOfRange 方法可以更簡單地做到這一點:

String[] newArray = Arrays.copyOf(listOfCities, listOfCities.length + 1);
newArray[listOfCities.length] = "Sydney";

有關複製陣列的其他方法,請參閱以下示例。請記住,在調整大小時,你需要一個與原始長度不同的陣列副本。

陣列大小調整的更好替代方案

如上所述,調整陣列大小有兩個主要缺點:

  • 效率低下。使陣列更大(或更小)涉及複製許多或所有現有陣列元素,並分配新的陣列物件。陣列越大,它就越貴。
  • 你需要能夠更新包含對舊陣列的引用的任何實時變數。

另一種方法是建立一個足夠大的陣列來開始。只有在分配陣列之前可以準確確定大小時,這才可行。如果你不能這樣做,那麼再次出現調整陣列大小的問題。

另一種方法是使用 Java SE 類庫或第三方庫提供的資料結構類。例如,Java SE集合框架提供了具有不同執行時屬性的 ListSetMap API 的許多實現。ArrayList 類最接近普通陣列的效能特徵(例如,O(N) 查詢,O(1) 獲取和設定,O(N) 隨機插入和刪除),同時提供更有效的大小調整而沒有參考更新問題。

ArrayList 的調整效率來自於每個調整大小的後備陣列大小加倍的策略。對於典型的用例,這意味著你只是偶爾調整大小。當你在列表的生命週期內分攤時,調整大小成本每個插入是 O(1)。在調整普通陣列的大小時,可以使用相同的策略。)