Java 陣列長度固定,動態擴容需建立新陣列並拷貝資料。本文展示利用 java.lang.reflect.Array 實現的通用擴容方法,支援基本型別與參考型別陣列,擴容策略為「原長度 × 1.1 + 10」。
| 方法 | 用途 |
|---|---|
Class.isArray() | 判斷是否為陣列型別 |
Class.getComponentType() | 獲取陣列元素型別 |
Array.getLength(Object) | 獲取陣列長度 |
Array.newInstance(Class, int) | 建立指定型別與長度的新陣列 |
Array.get(Object, int) | 獲取陣列指定索引元素 |
System.arraycopy() | 高效陣列拷貝(native 實現) |
public class ArrayGrowTest {
/** 陣列擴容:支援任意型別陣列 */
public Object goodArrayGrow(Object array) {
Class<?> clazz = array.getClass();
if (!clazz.isArray()) return null;
Class<?> componentType = clazz.getComponentType();
int length = Array.getLength(array);
int newLength = length * 11 / 10 + 10; // 擴容 10% + 10
Object newArray = Array.newInstance(componentType, newLength);
System.arraycopy(array, 0, newArray, 0, length);
return newArray;
}
/** 列印陣列內容 */
public void printArray(Object array) {
Class<?> clazz = array.getClass();
if (!clazz.isArray()) return;
Class<?> componentType = clazz.getComponentType();
int length = Array.getLength(array);
System.out.print(componentType.getName() + "[" + length + "]={");
for (int i = 0; i < length; i++) {
System.out.print(Array.get(array, i) + " ");
}
System.out.println("}");
}
public static void main(String[] args) {
ArrayGrowTest test = new ArrayGrowTest();
// 測試 int 陣列
int[] aInt = {1, 2, 3, 4};
test.printArray(aInt);
aInt = (int[]) test.goodArrayGrow(aInt);
test.printArray(aInt);
// 測試 String 陣列
String[] aStr = {"hello", "world", "ni", "hao", "ma"};
test.printArray(aStr);
aStr = (String[]) test.goodArrayGrow(aStr);
test.printArray(aStr);
}
}
int[4]={1 2 3 4 }
int[14]={1 2 3 4 0 0 0 0 0 0 0 0 0 0 }
class java.lang.String[5]={hello world ni hao ma }
class java.lang.String[15]={hello world ni hao ma null null null null null null null null null null }
基本型別陣列新增元素預設值為 0/false,參考型別為 null。
int[]、String[]),反射可精確獲取getComponentType() 返回元素的 Class 物件,基本型別返回 Integer.TYPE 等(int[])、(String[])),編譯器可檢查| 策略 | 公式 | 特點 | 適用場景 |
|---|---|---|---|
| 固定增量 | length + N | 簡單、記憶體碎片少 | 小陣列、可預估增長 |
| 倍數增長 | length * 1.5 / 2 | 摊還 O(1)、空間換時間 | 通用集合(ArrayList 採用 1.5) |
| 混合策略 | length * 1.1 + 10 | 平衡記憶體與擴容頻率 | 中大型陣列、未知增長模式 |
利用 java.lang.reflect.Array 實現通用陣列操作,是 Java 反射 API 的經典應用。理解陣列在執行期保留型別資訊、掌握 ComponentType 與 Array.newInstance 核心組合,能構建出型別安全、高效能的陣列工具。實務中,優先使用 ArrayList 等成熟集合,僅在極致效能或特殊型別需求時自行實作。