使用反射機制,獲取 ArrayList 的容量大小


  本文所有說明及代碼示例都是基於JDK 1.8 

  ArrayList 提供size()方法獲取當前集合的元素數量,但無法知道當前集合的容量,翻看 ArrayList 的源代碼,可以看到字段 elementData 用於存放數組元素,只要能獲取到 elementData 的值,通過 elementData.length 就可以得到當前集合的容量,因為無法直接獲取 elementData 的值,所以想到通過反射機制來得到該值。

  直接看下面的代碼吧

import java.lang.reflect.Field;
import java.util.ArrayList;


public class ArrayListCapacity {

    public static int getArrayListCapacity(ArrayList<?> arrayList) {
        Class<ArrayList> arrayListClass = ArrayList.class;
        try {
            //獲取 elementData 字段
            Field field = arrayListClass.getDeclaredField("elementData");
            //開始訪問權限
            field.setAccessible(true);
            //把示例傳入get,獲取實例字段elementData的值
            Object[] objects = (Object[])field.get(arrayList);
            //返回當前ArrayList實例的容量值
            return objects.length;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }

}

 

現在用一些代碼進行測試

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {

        //初始化
        ArrayList list = new ArrayList();
        System.out.println("初始容量為:"+ArrayListCapacity.getArrayListCapacity(list));
        System.out.println("初始元素數據為:"+list.size());

        for (int i=1; i<20; i++){
            list.add(i);
        }

        System.out.println("當前容量為:"+ArrayListCapacity.getArrayListCapacity(list));
        System.out.println("當前元素數據為:"+list.size());

    }

}

代碼運行結果

初始容量為:0
初始元素數據為:0
當前容量為:22
當前元素數據為:19

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM