使用反射机制,获取 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
原文地址:https://www.cnblogs.com/hs2018/p/10449970.html