zoukankan      html  css  js  c++  java
  • 使用反射机制,获取 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
  • 相关阅读:
    转来的:Diablo中的七大套装背景
    我的单元测试认识之路(下)
    《You can do it!》的chapter 2笔记
    一个枚举的简单应用
    仿百度的搜索下拉提示
    简单的 菜单当前选中 解决思路
    单元测试框架NUnit 之 Attributes特性(一)
    单元测试框架NUnit 之 constraints 约束
    分享个自己的ajax封装
    开源单元测试工具 Nunit
  • 原文地址:https://www.cnblogs.com/hs2018/p/10449970.html
Copyright © 2011-2022 走看看