首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 陣列動態擴容通用實現:利用反射 API 支援任意型別陣列

     編輯:Java 綜合教學

Java 陣列動態擴容通用實現:利用反射 API 支援任意型別陣列

Java 陣列長度固定,動態擴容需建立新陣列並拷貝資料。本文展示利用 java.lang.reflect.Array 實現的通用擴容方法,支援基本型別與參考型別陣列,擴容策略為「原長度 × 1.1 + 10」。

核心反射 API

方法用途
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。

關鍵技術點解析

  1. 型別擦除不影響陣列:陣列在執行期保留具體元素型別(int[]、String[]),反射可精確獲取
  2. ComponentType 是關鍵:getComponentType() 返回元素的 Class 物件,基本型別返回 Integer.TYPE 等
  3. Array.newInstance:唯一能動態建立具體型別陣列的方法
  4. 強制轉型安全:呼叫端需根據原始型別轉型((int[])、(String[])),編譯器可檢查

實務應用場景

  • 自定義集合類別底層儲存(如 ArrayList 實作)
  • 高效能數值計算避免物件裝箱
  • 序列化/反序列化框架陣列處理
  • 原始型別陣列工具庫開發

擴容策略選擇建議

策略公式特點適用場景
固定增量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 等成熟集合,僅在極致效能或特殊型別需求時自行實作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved