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
  • 相关阅读:
    第四章:Django模型——添加 Event发布会的表 报错
    第四章:Django模型——admin后台管理
    第四章:Django 模型 —— 设计系统表
    第三章:3.9 清除 Google 浏览器中的缓存
    第三章:3.9 关上窗户
    第三章:3.9 引用Django 认证登陆
    第三章:3.8 登陆 Django 默认后台
    降脂食物
    决定孩子人生高度的,不是知识而是这个!
    百万保险
  • 原文地址:https://www.cnblogs.com/hs2018/p/10449970.html
Copyright © 2011-2022 走看看