本文所有說明及代碼示例都是基於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