Java 集合框架学习 - List:ArrayList 的扩容机制

 Java集合框架是十分重要且具有学习意义的,今天对它的List接口下的ArrayList实现类的扩容机制进行深入学习,这篇文章也就应运而生。

目录

开始

ArraysSupport.newLength 方法

常量值 SOFT_MAX_ARRAY_LENGTH 是什么

一次性添加多个元素超出 ArrayList 原容量

System.arraycopy 方法


开始

ArrayList底层其实就是一个简单的用于存储Object类型的数组,如果不加以设置,那么初始化长度是0

    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

其中 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是长度为0的空数组。

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

那么ArrayList是什么时候初始化容量的呢?由ArrayList的源码文档可知,当添加第一个元素时,任何带有 elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的空 ArrayList 都将扩展到 DEFAULT_CAPACITY

 而这个 DEFAULT_CAPACITY  是什么呢?下面由一个小 demo ,带着我们一起去了解一下。

public class test01 {
    public static void main(String[] args) {
        outOfIndexWithAddOne();

//
    }

    private static void outOfIndexWithAddOne() {
        ArrayList<String> list = new ArrayList<>();
        list.add("你好");
        String[] strs = {"a","a","a","a","a","a","a","a","a"};
        list.addAll(Arrays.asList(strs));
        // -----------------------------------
        list.add("你好啊"); //TODO expanding the previous capacity.
        System.out.println(list);
    }

}

当调用 add() 方法向 ArrayList 中添加进第一个元素,数组的扩容机制就开始工作了。

    public boolean add(E e) {
        modCount++;
        add(e, elementData, size);
        return true;
    }

//

    private void add(E e, Object[] elementData, int s) {
        if (s == elementData.length)
            elementData = grow();
        elementData[s] = e;
        size = s + 1;
    }

//

    private Object[] grow() {
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值