使用反射机制,获取 ArrayList 的容量大小
Posted hs2018
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用反射机制,获取 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
以上是关于使用反射机制,获取 ArrayList 的容量大小的主要内容,如果未能解决你的问题,请参考以下文章