ArrayList 扩容方式 利用反射查看 笔记

ArrayList 扩容方式 利用反射查看 笔记

import java.lang.reflect.Field;
import java.util.*;

public class Test {
    
    

    public static void main(String[] args) {
    
    
        ArrayList<Integer> list = new ArrayList();
        //未放值
        System.out.println(list.size());
        System.out.println(getCapacity(list));
        list.add(1);
        //放入一个值 默认容量为10
        System.out.println(list.size());
        System.out.println(getCapacity(list));
        for(int i=0;i<10;i++){
    
    
            list.add(i);
        }
        //超过10 进行1.5倍扩容
        System.out.println(list.size());
        System.out.println(getCapacity(list));
    }

    public static Integer getCapacity(ArrayList list){
    
    
        Integer length = null;
        Class c = list.getClass();
        Field field;
        try {
    
    
            //通过Class类中getDeclaredField获取类特定的方法,name参数指定了属性的名称
            field = c.getDeclaredField("elementData");
            field.setAccessible(true);
            Object[] o = new Object[0];
            //返回指定list上此 Field 表示的字段的值
            o = (Object[]) field.get(list);
            length = o.length;
        } catch (NoSuchFieldException e) {
    
    
            e.printStackTrace();
        } catch (IllegalAccessException e) {
    
    
            e.printStackTrace();
        }
        return length;
    }

}

结果

0
0
1
10
11
15

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/qq_41454682/article/details/107802393