ArrayList 的初始容量多少?

List list = new ArrayList<>(); list 的初始容量到底是多少

在 JDK 8 中 查看 ArrayList 源码

    /**
     * Constructs an empty list with an initial capacity of ten.
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

上面的注释是 构造一个空数组 初始容量为 10 (JDK7中初始容量为10 ,注释应该是没及时更新),但是 查看 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 发现

    /**
     * Shared empty array instance used for default sized empty instances. We
     * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
     * first element is added.
     */
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

{} 其实就是个空数组,inflate when first element is added 就是说当第一个元素添加的时候才扩容(inflate)

可以运行下面代码验证一下

    public static void main(String[] args){


        List list = new ArrayList<>();

        try {

            Field field = list.getClass().getDeclaredField("elementData");
            field.setAccessible(true);
            int size = ((Object[]) field.get(list)).length;
            System.out.println(size);

            list.add(1);

            Field field2 = list.getClass().getDeclaredField("elementData");
            field2.setAccessible(true);
            int size2 = ((Object[]) field2.get(list)).length;
            System.out.println(size2);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 

输出:

0
10

 

可见第一次创建数组的时候如果没有指定大小,默认是 {} 就是个空数组,容量为 0 不是 10 ,只有当第一次添加的时候才扩容

JDK8 中改为这种懒加载模式,一定也有它的道理,但是在阿里巴巴java开发手册中建议 创建数组时预先指定大小。

建议 开发中 如果能知道 数组大小,预先指定大小 避免多次扩容 数据复制。

 

备注:日常开发中涉及到分页查询一般查询为 10条数据,可能这也是JDK 之前初始设置为 10 而不是 8 或 16 的原因。

 

你可能感兴趣的:(Java)