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