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的