Java中数组的容量是固定的,顶以后无法修改,而集合类很好的解决的变长数组的需求,集合的容量是有Java自己控制的,但是如何才能知道扩容后的大小呢?
如果是使用size(),我们看到的依然是其中元素的个数,而没有办法看到扩容后的容量大小,为了看到这个容量大小我们可以使用反射来查看,下面直接上代码
public static void main(String[] args) {
List<Integer> myList=new ArrayList<Integer>(10);
System.out.println(myList.size());
myList.add(1);
myList.add(2);
myList.add(3);
myList.add(4);
myList.add(1);
myList.add(2);
myList.add(3);
myList.add(4);
myList.add(4);
System.out.println(myList.size());
myList.add(6);
myList.add(5);
Class c=myList.getClass();
Field f;
try {
f=c.getDeclaredField("elementData");
f.setAccessible(true);
Object[] o=(Object[])f.get(myList);
System.out.println(o.length);
} catch (NoSuchFieldException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
运行得到的结果为
可以看到在达到初始容量后,扩容为了原来的1.5倍,但是我之前在一些书中看到的结论是(length*3)/2+1,但是经过自己的实践发现是直接的1.5倍,我的jdk为1.8的