使用反射机制,获取 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 的容量大小的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList的去重排序以及其他应用

Java中ArrayList的初始容量和容量分配

面试必备透过源码角度一步一步带你分析 ArrayList 扩容机制

ArrayList,LinkedList的对比

面试JAVA基础集合类

2023面试专题:JAVA基础